【问题标题】:Undefined reference to multiply未定义的乘法引用
【发布时间】:2012-07-05 12:06:57
【问题描述】:

我正在尝试在汇编程序中调用 C 函数。这是我的代码: C:

int multiply(int what)
{
    return what * 2;
}

ASM:

extern multiply

start:
    mov eax, 10
    push eax
    call multiply

    jmp $

;empty 
times 510-($-$$) db 0
dw 0xAA55

我正在通过 gcc (MinGW) 将 C 代码编译为 elf,并通过 NASM 将 ASM 代码编译为 elf。我正在编译它没有任何问题,但是当我尝试使用此代码(用于创建 .bin 文件)时:

gcc -o test.bin work.o test.o

我收到此错误:

有人知道如何从 ASM 代码中调用 C 函数、编译它并将其链接到工作的 .bin 文件吗?请帮忙。

【问题讨论】:

    标签: c gcc assembly compilation linker


    【解决方案1】:

    尝试加'_'来相乘:

    extern _multiply
    

    在这个简单的例子中对我有用:

    global  _main
    
    extern  _printf
    
    section .data
    
    text    db      "291 is the best!", 10, 0
    strformat db    "%s", 0
    
    section .code
    
    _main
        push    dword text
        push    dword strformat
        call    _printf
        add     esp, 8
        ret
    

    【讨论】:

    【解决方案2】:

    在您的 .asm 文件中尝试“全局乘法”而不是“外部乘法”。你不应该需要 ELF 的下划线(我不认为),但是你可以通过在 Nasm 的命令行中添加“--prefix _”让 Nasm 自动为任何“extern”或“global”添加下划线。

    编辑:我收回这一点,“extern”是正确的。您似乎没有“主要”。尝试添加“--nostartfiles” (可能只有一个连字符)到 gcc 的命令行。

    最好的,

    弗兰克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2012-06-29
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多