无法在macOS Sierra上将汇编文件(.s)与GCC链接

时间:2018-06-08 15:11:26

标签: c macos gcc assembly

我有两个要编译的文件。 第一个是main.c,第二个是在汇编(work.s)中进行求和和乘法的函数。

这是代码:

main.c文件:

#include <stdio.h>

short work(); 

int main() {

    short z = work();
    printf("work(); -> %hd\n", z);
    return 0;
}

work.s文件:

.globl work;

work :

    xorl %eax,%eax;
    xorl %ecx,%ecx;
    movw $20,%ax;
    subw $2,%ax;
    movw $7,%cx;
    addw $3,%cx;
    movw $10,%cx;
    subw $3,%cx;
    shl $1,%cx;
    addw %cx,%ax;
    ret;

使用gcc命令行:gcc -m32 main.c work.s -o main

这是输出:

  

架构i386的未定义符号:

     

&#34; _work&#34;,引自:         _main in main-fbbcca.o

     

ld:找不到架构i386的符号

     

clang:错误:链接器命令失败,退出代码为1(使用-v查看   调用)

虽然在Linux上使用相同的文件和命令,但是为什么以及如何解决它?

2 个答案:

答案 0 :(得分:3)

也许将你的全局更改为gcc正在寻找的名称?

.globl _work;

_work :
       ...

还有其他方法:

https://montcs.bloomu.edu/~bobmon/Code/Asm.and.C/C-asm/Asm-C-example0.shtml

&lt; =不同的编译器,相同的原则......

答案 1 :(得分:2)

work.s中,将work更改为_work它出现的两个位置。编译器将下划线作为C名称的前缀。汇编语言更加简单,因此您必须自己为下划线添加前缀。