c - 使用 GCC 将程序集 (AT&T) 文件与 C 程序链接时出现问题

标签 c macos assembly linker-errors abi

我的 C 程序在“main.c”中,在“list_equal.c”中有一个名为 list_equal() 的函数。

#include <stdlib.h>
#include "main.h"

int list_equal(const node_t *l1, const node_t *l2) {
    while (l1!=NULL && l2!=NULL) {
        if (l1->elem != l2->elem) return 0;
        l1 = l1->next;
        l2 = l2->next;
    }
    return l1==NULL && l2==NULL;
}

当我编译我的程序时使用:

$ gcc -m32 main.c list_equal.c -o main

一切正常,我能够运行我的程序“./main”。

然后我使用 AT&T 语法将我的函数翻译成汇编代码,并将其命名为“list_equal.s”。这是代码。

.globl list_equal

list_equal:

movl 4(%esp),%eax
movl 8(%esp),%ecx

L:

testl %eax,%eax
jz E
testl %ecx,%ecx
jz E
movw (%ecx),%dx
cmpw %dx,(%eax)
je F
movl $0,%eax
ret

E:

testl %eax,%eax
setz %al
testl %ecx,%ecx
setz %ah
andb %ah,%al
movsbl %al,%eax
ret

F:

movl 4(%eax),%eax
movl 4(%ecx),%ecx
jmp L

但是当我再次尝试编译我的程序时,这次使用程序集“list_equal.s”,命令为:

$gcc -m32 main.c list_equal.s -o main

我收到此错误消息:

Undefined symbols for architecture i386:
  "_list_equal", referenced from:
      _test in main-bbda7f.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

提前谢谢你。

关于我的 gcc 编译器的信息:

$ gcc --version
Configured with: --prefix=/Applications/Xcode_9.4.1.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode_9.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

最佳答案

编译器会在函数名前加一个下划线字符。

如果你这样调用它,你可以看到编译器生成了什么:

gcc -S -m32 list_equal.c -o list_equal.c.s

没有 -m32 就没有额外的字符。

关于c - 使用 GCC 将程序集 (AT&T) 文件与 C 程序链接时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431890/

相关文章:

xcode - 如何使Xcode在Mac Sierra(10.12.6)上运行

macOS 中的 Swift 打印

swift - macOs Swift 更改最小化行为?

c++ - 我必须做什么才能在数据区执行代码,(段保护)

assembly - 二进制补码快速方法

c - 如何将报表打印到不同的列中

c - 删除链接结构的值

c - 为什么这个 switch case 总是返回 0?

c - 收到 1 或 2 个后,从客户端读取数据包停止

performance - 为什么内存往返比不执行往返更快?