#include<stdio.h> int global_init_val = 84; //.data int global_uninit_val; __attribute__((section("FOO"))) int global = 42;//FOO int main(){ int init_a = 20; int uninit_b; static int static_b = 40;//.data static int static_uninit_c; return 0; }
.o
到可执行文件.out
,合并方式一般由两种
a.o
的所有段放好了,然后接下来放b.o
的所有段,但是这种方法有缺点
readelf -s hello2.o
),而分配虚拟空间后,.text的虚拟空间是Y,所以main的最终的虚拟地址就是X+Y在ELF文件格式中,存在一个重定位表,该表记录的信息是:该目标文件所有存在外部引用的地方,而重定位表往往由多个,比如.ref.text
,.ref.rodata
,使用objdump -r hello2.o
可以查看文件的重定位表
符号解析就是根据重定位表,找到哪里需要重定位,重定位的符号是什么,然后再去全局符号表找到该符号的虚拟地址
指令修正方式,<<程序员的自我修养>>这本书p109有详细的例子说明