|
|

楼主 |
发表于 2005-4-5 13:02:09
|
显示全部楼层
Post by kj501
口气怎么这么肯定呀?ld被人使用了这么多年,如果真的有问题也早就被debug光了。
事实与理论不符合时,是先怀疑理论不正确,还是仔细想想自己在什么地方做错了?
通常情况下,一般都是自己做错了。因为理论是经过了很多人很多次实践的检验的,真的要是有错误,也早就被别人发现了。轮到你去发现新大陆的机会是极少极少的。
OK,回到正题:
程序通常不会按照指令存贮的顺序逐条执行的,在一个地方可以用跳转指令转移到另一个地方执行。在你的程序中虽然b.o在链接时没有被放在前面,但在可执行文件中,程序执行入口点的地址是由ELF的段头表决定的。看看下面readelf的结果:
- bash-2.05b$ objdump -d a.out
- a.out: 文件格式 elf32-i386
- 反汇编 .text 节:
- 08048094 <a>:
- 8048094: 89 c0 mov %eax,%eax
- 8048096: 90 nop
- 8048097: 90 nop
- 08048098 <b>:
- 8048098: 89 db mov %ebx,%ebx
- bash-2.05b$ readelf -h a.out
- ELF 头:
- 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 (可执行文件)
- Machine: Intel 80386
- Version: 0x1
- 入口点地址: 0x8048098
- 程序头起点: 52 (bytes into file)
- Start of section headers: 200 (bytes into file)
- 标志: 0x0
- 本头的大小: 52 (字节)
- 程序头大小: 32 (字节)
- 程序头数量: 3
- 节头大小: 40 (字节)
- 节头数量: 7
- 字符串表索引节头: 4
- bash-2.05b$
复制代码
入口点地址不就是b.o被链接后的地址吗?!!
呵呵,这位仁兄貌似在说教.在下承认你说的没错.
这里有个可执行文件的概念在里面可你有没有注意到我在使用ld的时候给的参数是--oformat binary,这样生成的是raw binary,而并不是elf文件格式,elf格式只有特定操作系统才认识,比如,linux(比较新的,以前是a.out).一般情况下,我们所说的可执行文件,都是指elf文件.正如阁下所说,这种文件格式有个elf header,当然如果是可执行格式的话,还应该有个program header,right?但现在我并不是要得到elf文件,而是raw binary,是操作系统无关的可执行文件(当然也可以说是可执行代码)
好了,我也言归正传了:所以我个人想法是.是不是ld 的这个参数(-e)只适用于被操作系统加载的可执行程序? 当然,也有可能有些地方没注意到,但绝不是elf文件格式所能解释的 |
|