我写了下面的加载器:
GLOBAL _start
EXTERN main
section .text
_start:
xor ebp, ebp ; ebp = 0
pop esi ; esi = argc
mov ecx, esp ; ecx = argv
and esp, 0xFFFF ; align esp
push ecx ; load argv
push esi ; load argc
call main ; call main
push eax ; exit with main's ret value
mov ebx,0
int 80h
还有一个简短的main
函数,现在我尝试使用gcc运行编译和链接这些文件,但使用命令
nasm -f elf32 loader.asm
gcc -c -m32 main.c
gcc -m32 main.o loader.o -o main.out
导致_start
错误的多重定义。我想这是因为gcc试图链接他自己的_start
。我怎样才能防止这种情况发生?
答案 0 :(得分:4)
您还没有告诉GCC没有链接到标准启动代码,因此GCC会链接到它。
告诉GCC不要在_start
中链接,在链接时将-nostartfiles
标记传递给GCC。
请注意,标准库(stdlib,stdio等)仍将被链接,除非您还使用-nodefaultlibs
标志。 -nostdlib
标志结合了两者。