Ошибка, которую вы получаете, состоит в том, что вы определяете _start
и потому что вы компилируете и связываете библиотеку C (используя GCC).Библиотека C определяет метку _start
, которая инициализирует время выполнения C .Две метки _start
являются причиной того, что компоновщик жалуется на переопределение _start
.Код запуска C в библиотеке отвечает за передачу управления на main
, когда он все правильно инициализировал.
Если вы используете библиотеку C (GLIBC) функционирует прямо или косвенно, чтобы обеспечить правильную инициализацию библиотеки C , связав ее с библиотекой и средой выполнения.По умолчанию это то, что GCC делает для вас (это можно переопределить).
Вы можете определить main
как функцию языка ассемблера, например:
extern fun
section .text
global main
main:
push rbp ; Pushing a 64-bit register aligns stack back on 16-byte
; boundary so the call to `fun` has proper 16-byte
; alignment per the AMD64(X86-64) System V ABI.
call fun
xor eax, eax ; RAX=0 (main's return value)
pop rbp ; Restore the stack
ret ; Return back to C startup code which will exit for us.
Вы должны иметь возможностьиспользуйте существующие команды для сборки с NASM, компиляции с GCC и связи с GCC.
Вы можете найти дополнительную информацию о _start
/ main
и о времени выполнения C ,несколько связанных здесь и информации о опции -nostartfiles
в ответах на этот другой вопрос .
Более подробная информация о требованиях к выравниванию стека содержится в ответах на этот Stackoverflow вопрос