链接做了什么

链接过程

  • 输入文件
目标文件中有什么
	1. 头信息 // 代码大小,翻译成该目标文件的源文件名称和创建日期
	2. 目标代码
	3. 重定位信息
	4. 符号 // 定义的全局符号, 引用的 (其他目标文件定义的,链接器定义的)
	5. 调试信息
  • 链接过程
1. 空间与地址分配
	1.1 扫描所有的输入目标文件,获得 输入文件中的 各个段长度(Size),属性(Attribute),位置(File off).
	1.2 按规则将 输入文件排序 的段 排序 并合并 // 哪个段放前面,哪个段放后面,一般 .text 段放前面
	1.3 合并前 , 计算 "每个输入文件中的段" 在内存中的位置(LMA&VMA)
	1.4 合并后 , 计算 "合并后的"      段  在输出文件的位置(File off)和长度(Size).
2. 符号管理
	2.1 确定符号地址(根据该符号在所属文件/段的偏移,和该段的LMA&VMA确定)
	2.2 收集 输入文件中的符号定义和"引用".放到一个全局符号表(包括符号名和LMA&VMA)
3. 重定位
	3.1 输入文件中填充的引用的函数符号地址为0xfffffffc , 填充的 引用的变量符号的地址 为 0x00000000
	3.2 在重定位表中找到这些 信息(偏移地址A,类型B和符号C).
	3.3 根据 "全局符号表" 和 符号C 获得符号C的真实 地址
	3.4 将 偏移地址A处的32字节 填充为  符号C的真实地址. // 其实指令修正方式包括很多规则,这里只是粗略描述,不太正确.

复杂问题

  • 符号类型不一致
  • 弱符号问题
  • 链接过程控制(影响 过程 空间与地址分配 )
文件中的链接指令
命令行
链接脚本

外围问题

  • 链接器的wrapper ? 到底链接了哪些文件

objdump 各个字段解析


objdump 是一个用于查看目标文件(如可执行文件、目标文件、共享库等)内容的命令行工具。它能够以十六进制或可读的汇编形式显示目标文件的内容,包括各种部分和节的信息。以下是 objdump 命令的一般用法及其字段解析:

objdump -h <file>
其中,-h 选项用于显示目标文件的节头表(Section Headers)。执行这个命令后,会显示类似下面的输出:

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000002c  0000000000401000  0000000000401000  00001000  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000008  000000000060102c  000000000060102c  0000102c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000004  0000000000601034  0000000000601034  00001034  2**2
                  ALLOC
这些字段的含义解释如下:
Idx:节的索引号。
Name:节的名称。
Size:节的大小。
VMA:节在内存中的起始虚拟地址(Virtual Memory Address)。
LMA:节在加载时的起始地址(Load Memory Address)。
File off:节在文件中的偏移量。
Algn:对齐方式。

后面的一行描述了节的属性(Attribute):
CONTENTS:表示该节包含数据或代码。
ALLOC:表示该节在内存中被分配。
LOAD:表示该节被加载到内存中。
RELOC:表示该节可能包含可重定位的位置。
READONLY:表示该节是只读的。
CODE:表示该节包含可执行代码。
DATA:表示该节包含初始化的数据。
通过 objdump 可以更深入地了解目标文件的结构、节、符号表、重定位表以及代码段等信息。

你可能感兴趣的:(gnu,工具链,java,前端,linux)