关于可重定位目标文件的格式与其符号表的概述
我们知道一个可执行的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可重定位目标文件的结构图
至此,可重定位目标文件的结构就已经简单叙述完毕,如有错误的地方,欢迎指出。
关于可重定位目标文件的格式与其符号表的概述相关推荐
- 04可重定位目标文件ELF文件解析
目录 一:可重定位目标文件的特点 二:可重定位目标文件的格式 一:可重定位目标文件的特点 •可被链接(合并)生成可执行文件或共享目标文件 •静态链接库文件由若干个可重定位目标文件组成 •包含代码.数据 ...
- Ubuntu16.04中的可重定位目标文件
最近在看<CSAPP>这本神书,其中看到了第七章链接中的可重定位目标文件,自己动手在ubuntu16.04上试了一试,发现有很多都做了一些改动,在此记录 1.源程序 main.c stat ...
- 可重定位目标文件(REL)的符号和符号表
可重定位目标文件由汇编器as生成,包含了当前模块定义的符号及引用的外部模块符号信息,可以与其他可重定位目标文件链接为一个可执行目标文件. 有三种不同类型的符号,第一种,由当前模块定义的全局符号:第二种 ...
- 认识目标文件的格式—— a.out COFF PE ELF
1.目标文件的常用格式 目标文件是源代码编译后未进行链接的中间文件(Windows的 .obj 和 Linux 的 .o),与可执行文件(Windows 的 .exe 和 Linux 的 ELF)的结 ...
- ELF格式解读-符号表
前言 一个优先的symtab文章 我们常常调试错误说需要符号表,那么符号表是什么?符号表仅仅用来调试? 符号表本质就是一个映射表,举个例子:某行二进制汇编代码映射到源码第几行. 符号表的作用: 调试 ...
- Windows MSVC 符号表(.lib文件)(C++符号表解析)(符号表是如何产生的)(第四步:链接)
核心思想: 由于不同的编译器采用不同的名字修饰方法,必然会导致由不同编译器编译产生的目标文件无法正常相互链接,这是导致不同编译器之间不能互操作的主要原因之一. 符号表的由来以及C++符号表解析 win ...
- linux 内核重定位,Linux 内核学习笔记:预备知识之“目标文件”
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文主要阐述 Linux 的目标文件(有可重定位目标文件.可执行目标文件和共享目标文件三种形式),并把重点放在其格式和案 ...
- 《程序员的自我修养-链接-装载与库》第三章 目标文件里有什么(1)
目录 0.引言 1.目标文件的格式 1.1 目标文件的格式及ELF文件格式的文件的分类 1.2 目标文件与可执行文件格式的小历史 2.目标文件是什么样的 2.1 程序与目标文件简介 2.2 BSS历史 ...
- c语言目标文件作用,关于编译:C语言中的目标文件是什么?
我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释. 其他任何编译文件和目标文件之间的真正区别是什么? 如果有人能够用人类语言进行解释,我将感到非常高兴. 一个更活跃的版本:stac ...
最新文章
- 美团实习面试:熟悉红黑树是吧?能不能写一下?
- 计算机网络应用基础 王建珍,计算机网络应用基础
- tf.nn.l2_loss() 与 权重衰减(weight decay)
- MySQL server PID file could not be found!
- jupyter python版本_Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)...
- opengl编程从入门到精通-hello,window
- Product Distribution chain id F4 value help的实现
- datatables 更新选中行 的一行数据
- (转)Some awareness before migrating from x86 to x64
- Java LinkedList addFirst()方法与示例
- 如何让HTML在手机上实现直接拨打电话以及发送短信?
- 计算机应用基础考试试题,2017计算机应用基础考试试题及答案
- Python 执行主程序
- ios mk上传文件到服务器,ios – 使用预签名URL将文件上传到AWS S3的代码有什么问题?...
- apache和nginx那点事儿--阻塞和异步
- Verilog HDL实现智能药盒
- 宏碁电脑BIOS没有usb启动项怎么办?
- 关于吴恩达深度学习总结
- 外文翻译原文附在后面_本周作业是翻译外文文献摘要,电子版,回复到作业中,提交附件,格式按照外文文献翻译模版,先中文再附上英文原文,只需要摘要_学小易找答案...
- 写给父亲的语音计算器(加减乘除的处理C#,三)
热门文章
- Linux环境下mysql建库命令
- 解决:You have 18 unapplied migration(s). Your project may not work properly until you apply
- generate()函数
- history命令历史记录中加时间
- 程序员20句励志名言
- 1.1 夏驰和徐策带你了解计算机的发展方向
- AD中的PCB如何导入自己制作的logo图标?
- 计算机是否将取代人类英语作文,机器人取代人类工作英语作文 [圣诞节英语作文大全:圣诞节将会取代春节吗]...
- 数据库用户授权以及ddl语言
- java编程思想之字符串深入(正则表达式)