(转载)GCC与Obj文件,动态链接文件和ELF文件

本文详细介绍了GCC编译过程中的Obj文件、动态链接文件和ELF(Executable and Linkable Format)文件。Obj文件是编译过程中产生的二进制文件,包含代码和数据,用于链接器做地址重定位。动态链接不复制函数库代码,而是提供函数库名称,由动态链接器在运行时加载所需函数。ELF文件是最常见的执行文件格式,包括可执行文件、共享对象文件等,其结构包含ELF头、程序头表、节头表等,提供了灵活的动态链接和执行需求。在内存中,程序由ELF文件和共享对象文件组合,通过动态链接器加载到特定地址执行。
摘要由CSDN通过智能技术生成

(转载)GCC与Obj文件,动态链接文件和ELF文件     

--------------------------------------------------------------------------------
 
1、Obj文件
     程序员编写程序,其实就是编写出一个2进制(binary)文件。假如我们声明一个变量char c,也就是声明需要一个8bit的空间,那么就需要向系统声明豫留8bit的空间,怎么做到这一点呢?就是编译一个特殊的2进制文件--obj文件,用gcc编译的C语言得到的执行文件,里面不仅包含CPU指令,还有很多别的信息在里面,它有很多格式COFF、ELF……等等,在最后一道编译过程中,链接器(linker)ld会加载一堆信息进入可执行文件。例如,当有多个编译后等待链接的.o这种可重定位(relocatable)文件,既然这些文件里面参数或者函数名的相对位置只是本身所在.o文件的相对位置,就有一些信息要告诉链接编辑器(link editor)怎么修改section的内容,来做relocate,也就是做地址的重新参照以便合成一个新的可执行文件。

     一个obj文件有两个重要时期,一个是正在链接(link)的时候,也就是处在
硬盘(disk)里的时候;一个是正在执行的时候,当然这时它位于内存里。我们平时说的ld linker其实叫link editor,最后编译的步骤ld把该有的信息写进可执行文件。如果是static link就会去找libxxx.a的函数库文件,把想要的程序代码片段拷贝一份进可执行文件,并且做成relocation后,把跳来跳去的参照写进可执行文件,这个文件就可以执行。

2、动态链接文件
     相对于静态链接(static link)拷贝原有的程序代码进可执行文件,动态链接不那样做,link editor把一些信息写进可执行文件而已。例如,需要的程序库名、函数名等,最后执行的时候,必须呼叫dynamic linker來做program intepreter,dynamic linker会根据需要的函数库名称,把想要的函数名字创造一个可执行的image放到内存,所以执行有动态链接的执行文件,最后通常都是由OS的exec系列的system call与dynamic linker如ld.so联合完成。

dynamic linker通常会做如下工作:
(1)把可执行文件的内容加载到process image
(2)把shared obj需要的东西加载到process image
(3)完成relocation

      本来这些obj文件里面的虚拟地址应该和文件的地址有相对应的偏移(offset),而文件首地址通常是0x08040800,这是绝对虚拟地址,但它只适合可执行文件,例如Linux extuable file通常是:
         file offset         virtual  address
         -----------         ----------------
         0x0                   0x08048000
         0x100                 0x08048100

      shared obj函数库里的程序代码必须为位置无关代码Position Independent Code (PIC),也就是说它的地址可能会随不同process而有不同,例如,一个程序只用了libc.so、ld-linux.so,通常这时候lib.so是从0x40017000开始的,但如果另一个程序多用一个libm.so,那么libc.so从0x40034000开始两个的printf参照(reference),就会有不同的地址,所以这种动态函数库的内部资料就要说明这些code是PIC。

3、ELF文件
(1)简介
     现在最常用的是一种叫ELF格式(executable and linkable format)的执行文件,ELF定义了一些变量与信息使得动态链接更有弹性,一个ELF的2进制文件按照spec 1.1版的说法有6种,下列是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值