1>段表: 在fileheader中 对应命令objdump -h readelf -S(更全) 它是以Elf32_shdr结构体为元素的数组,每个Elf32_shdr结构体对应一个段,所以Elf32_shdr被称为段描述符
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2>局部变量用寄存器,局部变量或者局部数组不够用时,系统使用堆栈。Objdump -h 只能显示出重要的段信息 而readelf -S可将所有的段表信息打印,包括辅助段
3>每个目标文件都有符号表(Symbol Table),记录了文件用到的符号,每个符号都有相应的值叫符号值(Symbol value),对于变量和函数符号值就是它们的地址
4>elf中的符号表往往是一个段,段名叫.symtab,符号表是一个ELF32_Sym结构的数组,每个结构对应一个符号,第一个符号无用
5>段的类型。段名不是本质,真正与段名绑定的段描述符,段名实际上是段描述符的一个元素,而其元素sh_type和sh_flags
6>.rel.text重定位表,表示.text段的重定位表
7>字符串表,elf有很多字符串如段名,变量名等。因为字符串的长度是不定的,一般把字符串集中起来放到一个表,使用字符串在表中的偏移来表示并且以\0来分隔,字符串本身就以这个字符表示结尾 .strtab字符串表保存普通的字符串 .shstrtab保存段表中用到的字符串,最常用的是段名。
8>用nm查看符号表
9>特殊符号:在程序中没有,但在生成可执行文件时可直接引用如__executable_start该符号为程序起始地址,但这都是虚拟地址,也可以再程序中直接使用这些符号,但要申明
10>为了防止冲突,unix下的C语言规定,C语言代码里所有的全局变量和函数经过编译后都在相应的符号前面加上"_".但这只能解决库与.c文件的矛盾但是不能结局多个C文件相同函数间的问题。
11>c++符号修饰,符号改编:名称空间。使每个函数一一对应一个修改后签名,便与编译器和链接器识别。但是不同的编译器有不同的修饰规则,这就导致了不兼容
12>强符号和弱符号 强引用:如果在目标文件链接如可执行文件时,如果它没有被定义,则报未定义错误,而弱引用不会报错,而仅将其作为0处理,在GCC中,可以是用代码__attribute ((weakref)) void foo()表示为这个函数为弱符号
13>弱符号和弱引用对库的意义。弱引用可以动态添加功能模块,而失去这个模块时,程序同样可以正常链接,只是失去了一部分功能而已