landker 发表于 2013-09-20 13:18

ld的问题

我写了一个非常简单的链接器,跟其他*.o链接生成了一个可执行文件(ELF格式),当运行它时,提示“已杀死”,运行环境:ubuntu

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

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

1)ulimit -c unlimited

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

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

landker 发表于 2013-09-20 13:29

本帖最后由 landker 于 2013-09-21 14:00 编辑

补充一下,如下:

1)代码1(start.asm):

extern        L0

global        _start

_start:
        jmp        $
      .......编译后为: 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)相关信息如下:ELF header(readelf -h test):
ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class:                           ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                     0
Type:                              EXEC (Executable file)
Machine:                           Intel 80386
Version:                           0x1
Entry point address:               0x80480bf
Start of program headers:          52 (bytes into file)
Start of section headers:          148 (bytes into file)
Flags:                           0x0
Size of this header:               52 (bytes)
Size of program headers:         32 (bytes)
Number of program headers:         3
Size of section headers:         40 (bytes)
Number of section headers:         13
Section header string table index: 6
程序头(readelf -l test):
Elf file type is EXEC (Executable file)
Entry point 0x80480bf
There are 3 program headers, starting at offset 52

Program Headers:
Type         Offset   VirtAddr   PhysAddr   FileSiz MemSizFlg Align
LOAD         0x00029c 0x08048000 0x08048000 0x008e5 0x008e5 R E 0x1000
LOAD         0x000b81 0x08049000 0x08049000 0x00013 0x00013 RW0x1000
GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x1000

Section to Segment mapping:
Segment Sections...
   00   .text
   01   .data
   02   Section 列表(readelf -S test):
There are 13 section headers, starting at offset 0x94:

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

080480bf <_start>:
80480bf:        eb fe                        jmp    80480bf <_start>
.......

landker 发表于 2013-09-21 13:59

回复 2# landker

有人知道吗?
   

EricFisher 发表于 2013-09-22 16:09

gdb就可以单步指令调试,
gdb) b *0x80480bf
gdb) r
gdb) info reg
gdb) ni

landker 发表于 2013-09-22 17:15

EricFisher 发表于 2013-09-22 16:09 static/image/common/back.gif
gdb就可以单步指令调试,
gdb) b *0x80480bf
gdb) r


.....

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

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

EricFisher 发表于 2013-09-22 17:18

本帖最后由 EricFisher 于 2013-09-22 17:22 编辑

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

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

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

landker 发表于 2013-09-22 17:39

回复 6# EricFisher

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

fly3ds 发表于 2013-10-05 07:06

本帖最后由 fly3ds 于 2013-10-05 07:09 编辑

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

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

页: [1]
查看完整版本: ld的问题