链接器为什么会为同一模块中定义的功能生成重定位条目?

时间:2018-11-26 21:12:07

标签: linker

我编写了以下代码,以了解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在同一模块中定义,因此其相对地址为知道吗?

0 个答案:

没有答案