可重定位目标文件

来源:互联网 发布:org域名值钱吗 编辑:程序博客网 时间:2024/06/06 00:19
目标文件分三种格式
  1. 可重定位目标文件:二进制代码和数据,由各个数据节(section)构成,从地址0开始。
  2. 可执行目标文件:可运行的二进制代码和数据。
  3. 共享目标文件:一种特殊类型的可重定位目标文件,动态加载链接。
Linux上,目标文件的格式称为可执行和可链接格式(ELF)。

gcc -c可以生成可重定位目标文件,然后用readelf -a可以查看文件内容。

ELF可重定位目标文件大致布局:
  • ELF头:描述文件和机器相关信息。
  • .text:代码。
  • .rodata:只读数据,如C风格字符串。
  • .data:已初始化的全局变量。
  • .bss:未初始化的全局变量。
  • .symtab:符号表,存放程序中定义和引用的函数和全局变量信息,不包含局部变量条目。
    • 全局符号:本文件定义,可被其它文件引用。
    • 外部符号:其它文件定义,本文件引用。
    • 本地符号:本文件定义,其它文件不能引用(注意区别本地变量)。
  • ...
  • ...
  • 节头部表:表中每一个条目描述一个对应的节。

符号表的解析。
源文件main.c:


对应的可重定位目标文件中的符号表:


其中Name为空的为链接器内部使用的本地符号,我们可以忽略。

Value:在对应节的偏移。
Size:目标大小。
Type:要么是数据,要么是函数。
Bind:本地或全局。
Vis:预留。
Ndx:符号所在的节,其实是节头部表中条目的索引。
Name:符号名。

节头部表:


根据节头部表可知,当Ndx=1,符号在.text;当Ndx=3,符号在.data,以此类推。
三个特殊伪节:
ABS:不该被重定位的符号,如main()函数。
UND:其它文件中定义,本文件中引用的符号,如swap()函数。
COM:还未分配位置的未初始化数据目标,如buf2,它最终放在.bss。
0 0
原创粉丝点击