免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2280 | 回复: 7

ld的问题 [复制链接]

论坛徽章:
0
发表于 2013-09-20 13:18 |显示全部楼层
我写了一个非常简单的链接器,跟其他*.o链接生成了一个可执行文件(ELF格式),当运行它时,提示“已杀死”,运行环境:ubuntu

我想请教的是,有什么方法可以单步调试这个程序?

另,我知道 coredump 是可以获取一些有用的信息,但不知道是否适用于这里(似乎一般是“段错误”才采取这种方式)?不管怎样,我试了一下(网上提供的方法),如下:

1)ulimit -c unlimited

2)./t_elf      //可执行文件名

但上面的方式似乎并不奏效(我也是第一次进行这样的设置),因为并没有在当前目录下找到 coredump 文件 。是否我的设置有误?

论坛徽章:
0
发表于 2013-09-20 13:29 |显示全部楼层
本帖最后由 landker 于 2013-09-21 14:00 编辑

补充一下,如下:

1)
  1. 代码1(start.asm):
  2. [BITS        32]
  3. extern        L0
  4. [section .text]
  5. global        _start

  6. _start:
  7.         jmp        $
  8.         .......
复制代码
编译后为: start.o

2)其他的目标文件集合假设为 others.o

3)我自己写了一个简单的链接器,将1)和2)一起链接,

test_ld  -o test start.o others.o

4)加载运行出错(ubuntu系统提示:已杀死)!

按照正常情况,系统在加载 test 后,整个代码段都被复制至起始地址为 0x8048000 的地方,而且第一条执行的代码应该是 0x80480bf(即:_start:的第一条语句:jmp $),即执行一个死循环(要手工ctrl+c 退出),但却提示出错.....

请教一下各位,到底哪里出错了?

5)相关信息如下:
  1. ELF header(readelf -h test):
  2. ELF Header:
  3.   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  4.   Class:                             ELF32
  5.   Data:                              2's complement, little endian
  6.   Version:                           1 (current)
  7.   OS/ABI:                            UNIX - System V
  8.   ABI Version:                       0
  9.   Type:                              EXEC (Executable file)
  10.   Machine:                           Intel 80386
  11.   Version:                           0x1
  12.   Entry point address:               0x80480bf
  13.   Start of program headers:          52 (bytes into file)
  14.   Start of section headers:          148 (bytes into file)
  15.   Flags:                             0x0
  16.   Size of this header:               52 (bytes)
  17.   Size of program headers:           32 (bytes)
  18.   Number of program headers:         3
  19.   Size of section headers:           40 (bytes)
  20.   Number of section headers:         13
  21.   Section header string table index: 6
复制代码
  1. 程序头(readelf -l test):
  2. Elf file type is EXEC (Executable file)
  3. Entry point 0x80480bf
  4. There are 3 program headers, starting at offset 52

  5. Program Headers:
  6.   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  7.   LOAD           0x00029c 0x08048000 0x08048000 0x008e5 0x008e5 R E 0x1000
  8.   LOAD           0x000b81 0x08049000 0x08049000 0x00013 0x00013 RW  0x1000
  9.   GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x1000

  10. Section to Segment mapping:
  11.   Segment Sections...
  12.    00     .text
  13.    01     .data
  14.    02     
复制代码
  1. Section 列表(readelf -S test):
  2. There are 13 section headers, starting at offset 0x94:

  3. Section Headers:
  4.   [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  5.   [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  6.   [ 1] .text             PROGBITS        08048000 00029c 0008e5 00  AX  0   0 16
  7.   [ 2] .data             PROGBITS        08049000 000b81 000013 00  WA  0   0  4
  8.   [ 3] .bss              NOBITS          080488f8 000b94 000000 00  WA  0   0  4
  9.   [ 4] .rodata           PROGBITS        080488f8 000b94 0000dc 00   A  0   0  1
  10.   [ 5] .rel.text         REL             080489d4 000c70 000180 08      7   1  4
  11.   [ 6] .shstrtab         STRTAB          08048b54 000df0 00006e 00      0   0  1
  12.   [ 7] .symtab           SYMTAB          08048bc2 000e5e 000510 10      8   8  4
  13.   [ 8] .strtab           STRTAB          080490d2 00136e 0001c5 00      0   1  1
  14.   [ 9] .comment          PROGBITS        08049297 001533 000056 01  MS  0   0  1
  15.   [10] .eh_frame         PROGBITS        080492ed 001589 000294 01   A  0   0  4
  16.   [11] .rel.eh_frame     REL             08049581 00181d 000098 08      7   1  4
  17.   [12] .note.GNU-stack   NOBITS          08049619 0018b5 000000 01  WA  0   0  4
复制代码
  1. 代码反编译(objdump -s -d --start-address=0x8048000 --stop-address=0x8048100 test):

  2. 080480bf <_start>:
  3. 80480bf:        eb fe                        jmp    80480bf <_start>
  4. .......
复制代码

论坛徽章:
0
发表于 2013-09-21 13:59 |显示全部楼层
回复 2# landker

有人知道吗?
   

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
发表于 2013-09-22 16:09 |显示全部楼层
gdb就可以单步指令调试,
gdb) b *0x80480bf
gdb) r
gdb) info reg
gdb) ni

论坛徽章:
0
发表于 2013-09-22 17:15 |显示全部楼层
EricFisher 发表于 2013-09-22 16:09
gdb就可以单步指令调试,
gdb) b *0x80480bf
gdb) r


.....

ld是我写的,但并没有加入.debug段(.eh_frame).....

另,如果要加入调试信息,该然后操作?

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
发表于 2013-09-22 17:18 |显示全部楼层
本帖最后由 EricFisher 于 2013-09-22 17:22 编辑

这种调试,gdb不需要.debug信息。

保留调试信息,需要把原来.o里的调试信息section连接,并输出到输出文件中。

如果elf文件有问题,可能在加载的时候,操作系统就把它杀掉了,这个时候貌似无法在gdb里调试。

论坛徽章:
0
发表于 2013-09-22 17:39 |显示全部楼层
回复 6# EricFisher

*.o 也是我编码生成的.....
   

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
发表于 2013-10-05 07:06 |显示全部楼层
本帖最后由 fly3ds 于 2013-10-05 07:09 编辑

自己写个LD,要干什么呢?仅仅是想了解ld的运行原理和过程吗。我看不如把你写的这个ld的源程序贴上来,看看能不能直接从源程序看出毛病。

最常见的是segmantation fault时会产生coredump,你这个似乎不属于这一类,似乎是被什么监控进程kill -9杀掉了,或者你自己的这个ld把自己kill了?

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP