Я написал следующий код, чтобы понять, как работает компоновщик 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
Вопрос: Почему существует запись перемещения, сгенерированная для функции подкачки,то есть, почему компилятор просто не использовал относительную адресацию ПК для ссылки на него, поскольку функция swap определена в том же модуле, что и main, и, следовательно, его относительный адрес известен?