Я изучаю, как работает компоновщик в Linux. Вот мой код в качестве примера:
// main.c
int printf(const char *format, ...);
void func1(int i)
{
printf("%d\n", i);
}
int main(void)
{
func1(1);
return 0;
}
Я выполняю команду gcc -c main.c
и получаю файл obj с именем main.o
.
Затем я выполняю команду objdump -r main.o
и вот это вывод:
main.o: file format elf64-x86-64
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000011 R_X86_64_32 .rodata
000000000000001b R_X86_64_PC32 printf-0x0000000000000004
000000000000002c R_X86_64_PC32 func1-0x0000000000000004
RELOCATION RECORDS FOR [.eh_frame]:
OFFSET TYPE VALUE
0000000000000020 R_X86_64_PC32 .text
0000000000000040 R_X86_64_PC32 .text+0x0000000000000022
Если я прав, objdump -r
покажет нам все таблицы перемещений в файле obj. В этом случае printf
и func1
все помещаются в таблицу перемещения.
printf
не определено в этом файле C, поэтому его необходимо переместить, но почему может func1
быть найденным в таблице перемещения тоже? Насколько я понимаю, func1
должен быть четко определен и может быть найден в разделе .text
, его не нужно перемещать, верно?