我编写了以下代码,以了解GNU链接器如何更好地工作:
int x = 4;
int y = 4;
int swap(){
x = 9;
}
int main(){
x = 7 + y;
swap();
return x;
}
我使用以下命令在Linux系统上对其进行了编译:
gcc -c test.c
然后我检查了通过以下命令生成的重定位条目:
readelf -r test.o
结果如下:
Relocation section '.rel.text' at offset 0x3fc contains 5 entries:
Offset Info Type Sym.Value Sym. Name
00000005 00000801 R_386_32 00000000 x
00000013 00000901 R_386_32 00000004 y
0000001b 00000801 R_386_32 00000000 x
00000020 00000a02 R_386_PC32 00000000 swap
00000025 00000801 R_386_32 00000000 x
Relocation section '.rel.eh_frame' at offset 0x424 contains 2 entries:
Offset Info Type Sym.Value Sym. Name
00000020 00000202 R_386_PC32 00000000 .text
00000040 00000202 R_386_PC32 00000000 .text
问题:为什么为交换功能生成一个重定位条目,即为什么编译器不仅仅使用PC相对地址来引用它,因为交换功能与main在同一模块中定义,因此其相对地址为知道吗?