Почему компоновщик генерирует запись перемещения для функции, определенной в том же модуле? - PullRequest
0 голосов
/ 27 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...