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