LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1134|回复: 2

关于链接过程的疑问

[复制链接]
发表于 2008-2-5 14:20:16 | 显示全部楼层 |阅读模式
我用objdump -d 反汇编了一下, 看到最低地址的代码(即init section)的地址不是从0x8048000开始的(而且地址不固定, 比如0x8048278或0x8048254等).  
1. 请问一下,  从0x8048000到0x8048278(或0x8048254)中间的是什么代码?  

我再用ld --verbose看了下内嵌的lds文件, 发现是从0x8048000+SIZEOF_HEADERS开始的.   我估计SIZEOF_HEADERS这个值是每次编译不同的代码都不同的. 我看了下binulits代码,
虽然找到了这个值,  但好像都不是相关的.   
2. SIZEOF_HEADERS是什么值?  (这应该和第一个问题是同一个问题)


3. 最后再问一下,  为什么链接器要从0x8048000开始呢?   下面还有好多线性空间没用呢?

谢谢
发表于 2008-2-16 16:41:52 | 显示全部楼层
OS 在 load 一个 ELF 文件的时候, 会直接将文件映射到 0x8048000 的地方.
我们知道一个可执行文件(比如ELF文件)除了包含必要的 machine code 以外, 还有很多控制信息(用来标示文件类型, 文件的结构, 动态链接时的必要信息, 字符串表, 符号表等等), 有些信息放在 machine code 之前, 这些信息就占用了从 0x8048000 开始的一段地址空间

可以使用 readelf -S 命令查看在 .init 之前究竟有些什么玩意儿.

至于为什么选择 0x8048000, 就不清楚了
回复 支持 反对

使用道具 举报

发表于 2008-2-16 23:45:15 | 显示全部楼层
SIZEOF_HEADERS应该是多个Elf32_Phdr结构的大小,至于有多少个Elf32_Phdr结构那要看Elf32_Ehdr结构里的e_phentsize变量的值了;
如果你想很深入的了解这方面的知识那就需要了解ELF文件格式了,你可以看看我写的这篇文章http://www.linuxsir.cn/bbs/thread323010.html,里面有详细的介绍,应该会对你有帮助的
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表