我有两个要编译的文件。 第一个是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上使用相同的文件和命令,但是为什么以及如何解决它?
答案 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名称的前缀。汇编语言更加简单,因此您必须自己为下划线添加前缀。