我们知道一个可执行的C程序要经过语言预处理、编译器、汇编器生成扩展名为.o的可重定位目标文件,再通过链接器链接生成可执行的目标文件。

1.什么是可重定位目标文件

       一个扩展名为.s 的ASCII汇编语言文件经由汇编器翻译成一个包含二进制代码和数据的.o文件,即可重定位目标文件。其特点是可在编译时与其它可重定位目标文件合并起来,由此创建一个可执行目标文件。

2.可重定位目标文件格式

(这里讨论的是现代X86-64Linux和 Unix系统使用的ELF格式)

       前四个节图中已作出解释,(ps:其中.data中放入已初始化的全局变量和静态C变量;.bss中放入未初始化的全局和静态C变量)现解释其余的节中存的信息:

  • .symtab  一个符号表,存放程序中定义和引用的函数和全局变量的信息。
  • .rel.text  一个.text节中位置的列表,当链接器把这个目标文件和其它文件组合是,需要修改这些位置。
  • rel.data  被模块引用或定义的所有全局变量的定位信息。
  • .debug 一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。
  • .line 原始C源程序中的行号和.text节中机器指令之间的映射。
  • .strtab 一个字符串表,其内容包括.symtab节和.debug节中的符号表以及节头部中的节名字。

    下面看一个例子:

 

输入命令:readelf -s main.o 查看其符号表,即.symtab节中存放的信息

        value表示符号在节中的偏移量;Type表示该符号是函数还是数据;Bind表示该符号是全局的还是局部的;Ndx表示该符号位于节与ELF头节的偏移,如.text节的Ndx为1;

        例:静态局部变量al1的Num是7,描述为存放在.bss节中偏移量为4的占4个字节大小的符号。

      1. 同一个节中的字符存放遵循数据对齐的规则;如.data节中数组array放在该节的首地址,2个整型数占8个字节,紧跟字符a放在偏移量为8的位置,占1个字节,以初始化的局部静态变量cal存放在.data节中偏移为12的位置,因为int型对象的首地址必须是4的倍数;

2.符号sum实际是一个函数的引用,由于此刻main.o与sum.o还没有进行链接,所以sum符号的类型还不能确定,只表示在不目标模块中引用但却在其它地方定义的符号。

3.COMMON与.bss的区别:COMMON中放未初始化的全局变量

                                                 .bss中放的是未初始化的静态变量以及初始化为0的全局或静态变量

再看看ELF头中的信息,ELF头中前16个字节的序列描述了生成了该文件的系统的字的大小和字节顺序,剩余的部分包含了帮助链接器语法分析和解释目标文件的信息。若要看ELF头中的信息则输入命令:readelf -h main.o

在main.o中的ELF头中,前三个魔术7f454c定义了文件的类型为可重定位目标文件,节头部表的起始地址992(0x3e0),节条数量为13,大小是64字节。

节头表中描述了不同节的位置和大小, 我们再看节头部表中的信息,输入命令:readelf  -S main.o

   

 由于已知ELF头为64字节大小、各节的偏移量和大小及节头部表的偏移和大小(节头数*节头大小=13*64Byte=832Byte),则可以画出ELF可重定位目标文件的结构图

 至此,可重定位目标文件的结构就已经简单叙述完毕,如有错误的地方,欢迎指出。

关于可重定位目标文件的格式与其符号表的概述相关推荐

  1. 04可重定位目标文件ELF文件解析

    目录 一:可重定位目标文件的特点 二:可重定位目标文件的格式 一:可重定位目标文件的特点 •可被链接(合并)生成可执行文件或共享目标文件 •静态链接库文件由若干个可重定位目标文件组成 •包含代码.数据 ...

  2. Ubuntu16.04中的可重定位目标文件

    最近在看<CSAPP>这本神书,其中看到了第七章链接中的可重定位目标文件,自己动手在ubuntu16.04上试了一试,发现有很多都做了一些改动,在此记录 1.源程序 main.c stat ...

  3. 可重定位目标文件(REL)的符号和符号表

    可重定位目标文件由汇编器as生成,包含了当前模块定义的符号及引用的外部模块符号信息,可以与其他可重定位目标文件链接为一个可执行目标文件. 有三种不同类型的符号,第一种,由当前模块定义的全局符号:第二种 ...

  4. 认识目标文件的格式—— a.out COFF PE ELF

    1.目标文件的常用格式 目标文件是源代码编译后未进行链接的中间文件(Windows的 .obj 和 Linux 的 .o),与可执行文件(Windows 的 .exe 和 Linux 的 ELF)的结 ...

  5. ELF格式解读-符号表

    前言 一个优先的symtab文章 我们常常调试错误说需要符号表,那么符号表是什么?符号表仅仅用来调试? 符号表本质就是一个映射表,举个例子:某行二进制汇编代码映射到源码第几行. 符号表的作用: 调试 ...

  6. Windows MSVC 符号表(.lib文件)(C++符号表解析)(符号表是如何产生的)(第四步:链接)

    核心思想: 由于不同的编译器采用不同的名字修饰方法,必然会导致由不同编译器编译产生的目标文件无法正常相互链接,这是导致不同编译器之间不能互操作的主要原因之一. 符号表的由来以及C++符号表解析 win ...

  7. linux 内核重定位,Linux 内核学习笔记:预备知识之“目标文件”

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文主要阐述 Linux 的目标文件(有可重定位目标文件.可执行目标文件和共享目标文件三种形式),并把重点放在其格式和案 ...

  8. 《程序员的自我修养-链接-装载与库》第三章 目标文件里有什么(1)

    目录 0.引言 1.目标文件的格式 1.1 目标文件的格式及ELF文件格式的文件的分类 1.2 目标文件与可执行文件格式的小历史 2.目标文件是什么样的 2.1 程序与目标文件简介 2.2 BSS历史 ...

  9. c语言目标文件作用,关于编译:C语言中的目标文件是什么?

    我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释. 其他任何编译文件和目标文件之间的真正区别是什么? 如果有人能够用人类语言进行解释,我将感到非常高兴. 一个更活跃的版本:stac ...

最新文章

  1. 美团实习面试:熟悉红黑树是吧?能不能写一下?
  2. 计算机网络应用基础 王建珍,计算机网络应用基础
  3. tf.nn.l2_loss() 与 权重衰减(weight decay)
  4. MySQL server PID file could not be found!
  5. jupyter python版本_Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)...
  6. opengl编程从入门到精通-hello,window
  7. Product Distribution chain id F4 value help的实现
  8. datatables 更新选中行 的一行数据
  9. (转)Some awareness before migrating from x86 to x64
  10. Java LinkedList addFirst()方法与示例
  11. 如何让HTML在手机上实现直接拨打电话以及发送短信?
  12. 计算机应用基础考试试题,2017计算机应用基础考试试题及答案
  13. Python 执行主程序
  14. ios mk上传文件到服务器,ios – 使用预签名URL将文件上传到AWS S3的代码有什么问题?...
  15. apache和nginx那点事儿--阻塞和异步
  16. Verilog HDL实现智能药盒
  17. 宏碁电脑BIOS没有usb启动项怎么办?
  18. 关于吴恩达深度学习总结
  19. 外文翻译原文附在后面_本周作业是翻译外文文献摘要,电子版,回复到作业中,提交附件,格式按照外文文献翻译模版,先中文再附上英文原文,只需要摘要_学小易找答案...
  20. 写给父亲的语音计算器(加减乘除的处理C#,三)

热门文章

  1. Linux环境下mysql建库命令
  2. 解决:You have 18 unapplied migration(s). Your project may not work properly until you apply
  3. generate()函数
  4. history命令历史记录中加时间
  5. 程序员20句励志名言
  6. 1.1 夏驰和徐策带你了解计算机的发展方向
  7. AD中的PCB如何导入自己制作的logo图标?
  8. 计算机是否将取代人类英语作文,机器人取代人类工作英语作文 [圣诞节英语作文大全:圣诞节将会取代春节吗]...
  9. 数据库用户授权以及ddl语言
  10. java编程思想之字符串深入(正则表达式)