ld的问题
我写了一个非常简单的链接器,跟其他*.o链接生成了一个可执行文件(ELF格式),当运行它时,提示“已杀死”,运行环境:ubuntu我想请教的是,有什么方法可以单步调试这个程序?
另,我知道 coredump 是可以获取一些有用的信息,但不知道是否适用于这里(似乎一般是“段错误”才采取这种方式)?不管怎样,我试了一下(网上提供的方法),如下:
1)ulimit -c unlimited
2)./t_elf //可执行文件名
但上面的方式似乎并不奏效(我也是第一次进行这样的设置),因为并没有在当前目录下找到 coredump 文件 。是否我的设置有误? 本帖最后由 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>
.......
回复 2# landker
有人知道吗?
gdb就可以单步指令调试,
gdb) b *0x80480bf
gdb) r
gdb) info reg
gdb) ni 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:22 编辑
这种调试,gdb不需要.debug信息。
保留调试信息,需要把原来.o里的调试信息section连接,并输出到输出文件中。
如果elf文件有问题,可能在加载的时候,操作系统就把它杀掉了,这个时候貌似无法在gdb里调试。 回复 6# EricFisher
*.o 也是我编码生成的.....
本帖最后由 fly3ds 于 2013-10-05 07:09 编辑
自己写个LD,要干什么呢?仅仅是想了解ld的运行原理和过程吗。我看不如把你写的这个ld的源程序贴上来,看看能不能直接从源程序看出毛病。
最常见的是segmantation fault时会产生coredump,你这个似乎不属于这一类,似乎是被什么监控进程kill -9杀掉了,或者你自己的这个ld把自己kill了?
页:
[1]