【问题标题】:Assembly function call from c来自 c 的汇编函数调用
【发布时间】:2014-08-18 03:37:38
【问题描述】:

我无法合并我的 kernel_entry.asm 和 main.c。我的 main.c 调用了一个 asm 函数 Sum。 nasm 和 gcc 都编译各自的文件。但是,链接器给出了错误。

kernel_entry.asm:

[bits 32]
[extern _start]
[global _Sum]

....

_Sum:
    push    ebp             
    mov     ebp, esp
    mov     eax, [ebp+8]    
    mov     ecx, [ebp+12]   
    add     eax, ecx        
    pop     ebp             
    ret 

main.c:

....
extern int Sum();

void start() {
    ....
    int x = Sum(4, 5);
    ....
}

为了编译源文件,我使用以下命令:

nasm kernel_entry.asm -f win32 -o kernel_entry.o
gcc -ffreestanding -c main.c -o main.o
....
ld -T NUL -o kernel.tmp -Ttext 0x1000 kernel_entry.o main.o mem.o port_in_out.o screen.o idt.o

链接器给出以下错误:main.o:main.c:(.text+0xa82): undifened reference to 'Sum'。我尝试了一切,但找不到任何解决方案。当我从 main.c 中删除 asm 函数调用时,它可以工作。

【问题讨论】:

  • 谢谢,但gcc -m32 对我不起作用。我正在使用 Windows 计算机。也许这就是原因?
  • 使用 nasm kernel_entry.asm -f elf -o kernel_entry.o 为我做到了
  • @rfernandes 你应该写出你的 cmets 的答案。
  • @Mr.32 谢谢提醒,完成

标签: c assembly


【解决方案1】:

答案的 TL;DR 版本是混合 nasm 的 -f win32 会生成一个与 Windows 上的 GNU 工具链不兼容的目标文件 - 如果要使用 ld 链接,则需要使用 -f elf。这在 NASM 的文档 here 第 7.5 和 7.9 节中有所描述。

对我的提示是通过运行nm kernel_entry.o 生成:

00000000 a .absolut
00000000 t .text
00000001 a @feat.00
         U _start
         U _Sum

这基本上将 Sum 显示为未定义的符号。编译为ELF后,我得到:

         U _start
00000000 T _Sum

在文本部分中将 Sum 表示为可识别的符号。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多