【问题标题】:Using custom main loader with GCC在 GCC 中使用自定义主加载器
【发布时间】:2016-09-13 15:03:58
【问题描述】:

我写了以下加载器:

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

【问题讨论】:

  • 可能带有 gcc -nostdlib 标志?

标签: c gcc nasm


【解决方案1】:

你没有告诉 GCC 不要链接到标准启动代码,所以 GCC 链接到它。

要告诉 GCC 不链接到 _start,请在链接时将 -nostartfiles 标志传递给 GCC。

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

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2013-10-21
    相关资源
    最近更新 更多