未定义的引用乘法

时间:2012-07-05 12:06:57

标签: c gcc assembly compilation linker

我正在尝试在汇编程序中调用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)和NASM的ASM代码将C代码编译为elf。我正在编译它没有任何问题,但当我尝试使用此代码(用于创建.bin文件)时:

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

我收到此错误: My error

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

2 个答案:

答案 0 :(得分:3)

尝试将'_'添加到乘法:

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

答案 1 :(得分:1)

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

编辑:我接受了,“extern”是正确的。你好像没有“主力”。尝试添加“--nartartfiles” (可能只有一个连字符)到gcc的命令行。

最佳,