使用 GCC 将程序集 (AT&T) 文件与 C 程序链接时出现问题
Problem linking an Assembly (AT&T) file with C program using GCC
我在 'main.c' 中有我的 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 [=12=],%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
就没有多余的字符。
我在 'main.c' 中有我的 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 [=12=],%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
就没有多余的字符。