【问题标题】:Can't link an assembly file (.s) with GCC on macOS Sierra无法在 macOS Sierra 上将程序集文件 (.s) 与 GCC 链接
【发布时间】:2018-11-18 16:34:50
【问题描述】:

我有 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

这是输出:

架构 i386 的未定义符号:

“_work”,引用自: _main in main-fbbcca.o

ld:未找到体系结构 i386 的符号

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

在具有相同文件和命令的 Linux 上,它可以工作,为什么以及如何修复它?

【问题讨论】:

    标签: c macos gcc assembly


    【解决方案1】:

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

    .globl _work;
    
    _work :
           ...
    

    还有其他方法:

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

    【讨论】:

    • 它有效,谢谢,我正在为考试学习汇编,我的教授在 Linux 上以这种方式解释了它,所以我必须遵循他的方法,但我会记住它:)。
    • @fed Linux 和 macOS 有不同的符号装饰方案。这就是为什么在 macOS 上需要下划线,而在 Linux 上不需要。
    • @feded:tuz 是正确的。不同的平台和不同的编译器只是有不同的“符号装饰方案”。在这里寻找进一步的讨论:Why do C compilers prepend underscores to external names?.
    • @paulsm4 谢谢,我不知道,但是我不明白为什么 Mac 需要在 .s 文件中使用下划线而 Linux 不需要。
    • 这不仅仅是“macOS vs. Linux”。平台(例如 Windows 与 BSD)或编译器(例如 gcc 与 CLang)的任何组合都可以“以不同的方式做事”。仅供参考,gcc 允许您使用 -fleading-underscore-fnoleading-underscore 编译器开关控制行为:gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html
    【解决方案2】:

    work.s 中,将work 更改为_work 出现的两个位置。编译器为 C 名称添加下划线前缀。汇编语言比较简单,所以你必须自己加上下划线前缀。

    【讨论】:

    • 我写了 因为如果我写它时没有空格,它会消失,#includes 变成粗体包含,不知道为什么。我的代码是#include
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2017-07-10
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    相关资源
    最近更新 更多