无法在 macOS Sierra 上将程序集文件 (.s) 与 GCC 链接

标签 c macos gcc assembly

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

这是代码:

ma​​in.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

这是输出:

Undefined symbols for architecture i386:

"_work", referenced from: _main in main-fbbcca.o

ld: symbol(s) not found for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation)

虽然在 Linux 上使用相同的文件和命令它可以工作,但为什么以及如何修复它?

最佳答案

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

.globl _work;

_work :
       ...

还有其他方法:

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

<=不同的编译器,相同的原理...

关于无法在 macOS Sierra 上将程序集文件 (.s) 与 GCC 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763624/

相关文章:

c - 在 GCC 中链接部分静态和部分动态

C: UDP 数据包源 Ip 伪造 - 无法接收数据包

android - 如何在 OSX for Android studio 中设置 NDK 构建路径

c - 我们什么时候使用 goto *expr;在C?

macos - 如何在 OS X 上构建 fat gcc46 libstdc++?

xcode - 如何配置 XCode 以创建正确的应用程序包

c++ - Lambda 语法或 gcc 错误的最后一刻更改?

c - 读取 fifo 的最后一行

java - 通过 JNI 将 Fortran 代码与 Java 集成

c - 动态类型选择是否会破坏 C 中的严格别名?