Компоновщик.md 2.7 KB

~={green}Компоновщик LD=~

После ассемблирования в полученном объектном файлу вместо реальных адресов меток находятся нулевые адреса. Этой задачей занимается компоновщик.

~={yellow}Задачи компоновщика:=~

  • Проставление адресов на место меток. В пределах одного или нескольких файлов.
  • Установка точки входа в программу. Если нет точки входа по умолчанию, то будет выбран адрес 401000.

    # Точкой входа по умолчанию для компоновщика 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=~

	.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