使用自定义主加载程序与GCC

时间:2016-09-13 15:03:59

标签: c gcc nasm

我写了下面的加载器:

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。我怎样才能防止这种情况发生?

1 个答案:

答案 0 :(得分:4)

您还没有告诉GCC没有链接到标准启动代码,因此GCC会链接到它。

告诉GCC不要在_start中链接,在链接时将-nostartfiles标记传递给GCC。

请注意,标准库(stdlib,stdio等)仍将被链接,除非您还使用-nodefaultlibs标志。 -nostdlib标志结合了两者。