~={green}Компоновщик LD=~
После ассемблирования в полученном объектном файлу вместо реальных адресов меток находятся нулевые адреса. Этой задачей занимается компоновщик.
~={yellow}Задачи компоновщика:=~
Установка точки входа в программу. Если нет точки входа по умолчанию, то будет выбран адрес 401000.
# Точкой входа по умолчанию для компоновщика ld является метка:
_start:
# Для установки другой точки входа нужно при сборке программы указать точку в параметре -e
$ ld test.o -o test.exe -e my_entry_point
Подгрузка статических библиотек.
Подгрузка динамических библиотек.
~={green}Компоновщик GCC=~
~={yellow}Особенности компоновщика GCC=~
~={yellow}Что примерно делает компоновщик GCC=~
.file "base.s"
.text
.globl _start
_start:
//...
//...
//...
call main
//...
//...
movq %rax, %rdi
movq $60, %rax
syscall
~={yellow}Важное=~ Компоновщик gcc по умолчанию создает позиционно-независимый исполняемый файл (PIE - Position Independent Executable). Для того, чтобы отменить такое поведение, нужно использовать при компоновке параметр -no-pie.
$ gcc main.o -o main.exe -no-pie