静态链接

1>.bss段在文件中不存在,即不占用文件空间,但是它装载时占用内存空间

 

2>分两步链接: 第一步,空间与地址分配:主要任务把所有的符号表收集起来,放到一个全局符号表中,注意:一个符号,一个段名都是由一个结构体来描述的,里面包含描述信息的各种属性。第二步,符号解析和重定位,重定位过程是核心

 

3>ld  a.o b.o -e main -o ab  -e指定程序入口函数,ld默认为__start。 -o表示为输出文件名

 

4>VMA 虚拟地址 LMA加载地址

 

5>linux下,elf可执行文件默认从地址0x080448000开始分配(虚拟地址)

 

6>具体:第一空间和地址的分配,将各个.o文件和成一个文件,各绝对地址确定,但是还没有重定位,第二步,链接器计算出符号地址

 

7>查看重定位表  objdump -r *.o  一般在重定位之前变量用0代替,函数用0xFFFFFFFC-4)的补码

 

8>i386体系elf格式的重定位结构简单,仅包含两个两个元素,一个描述偏移地址,一个描述符号Elf32_Rel结构体

 

9>一般链接不正确是少了某个库,或者输入目标文件路径不正确或者符号声明不一样。

 

10>查看符号表 readelf -s

 

11>i386里面call的两种调用,一种是近址相对位移调用指令,如编译器的汇编码中出现call adr,则adr是被调函数相对于下一条指令的偏移量,这就出现了相对地址修正

 

12>编译器将未初始化的全局变量当做弱符号处理

 

13>COMMON规则:COMMON块空间大小不一致时,以最大的那块为标准。

 

14>gcc扩展: int a __attribute__((common))当做COMMON块处理

 

14>一种开发语言往往会附带语言库(language library).一大部分代码本质上是这些库是对操作系统api的封装 liux中常用的c语言库/usr/lib/libc.a

 

15>对制作静态库文件ar程序的理解:将这种printf.o malloc.o等目标程序压缩到一起,并且对齐进行编号和索引,以便于查找和检索 用ar -t libc.a查看打包了那些.o文件 ar -x libc.a里面的目标文件解压到当前目录,可以将libc.a ,在链接的时候,链接器会自动按照所需要的符号将相应的目标文件链接进来gcc -v或者--verbose可以讲编译和链接过程全部打印出来collect2程序是对ld程序的包装

16>静态库里面一个目标文件只包含相应的一个函数,是因为链接器在链接的时候是以目标文件为单位的

 

17>链接控制的方法:用命令如-e等,使用链接脚本.linux中的.lds  ld -T xxx指定链接脚本,intiel IA32下普通ELF文件链接脚本为elf_i386.x 共享库脚本文件为elf_i386.xs

 

18>-fno-builtin GCC编译器提供很多的内置函数。他们会把常用的C库函数替换成编译器的内置函数,以达到优化的功能,如GCC将只带有字符串参数的printf替换成puts,以节省解析时间。这个选个可以关闭GCC的这个功能 -static表示静态链接 -e指定程序的入口函数

 

18>BFD(binary file Descriptor library)把目标文件抽象成一个统一的模型 BFD库程序只要通过这个抽象的目标文件模型就可以实现操作BFD支持的目标文件格式,现在的GCC,链接器等GNU工具都是通过BFD库来处理目标文件,而不是直接操作目标文件


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值