现在,我正在学习如何编写汇编语言。所以,我写了一个名为test_func.S的汇编文件和一个C源文件main.c.我编译了这些文件,对于test_func.S,我使用“as”编译“test_func.S” 对于test_func.S,我只定义一个空函数。以下是我在test_func.S。
中的代码.globl test_func
test_func:
movl $99, %eax
ret
我的main.c也很容易。只需调用我在test_func.S中定义的函数。以下是我的代码。
extern int test_func();
int main() {
return test_func();
}
首先,我使用作为来编译我的test_func.S。以下是我在终端上的命令。
as -arch i386 test_func.S -o test_func.o
接下来,我使用 clang 编译“main.c”。
clang -m32 -c main.c -o main.o
为了生成可执行文件,最后一步是将这些目标文件链接到可执行文件中。我使用以下命令。
clang -m32 test_func.o main.o -o main
但是, ld 会产生错误:
"Undefined symbols for architecture i386:
"_test_func", referenced from:
_main in main.o
ld: symbol(s) not found for architecture i386"
我在另一台运行ubuntu系统的计算机上使用相同的命令和相同的源文件,一切都是操作系统。
当我echo $?
时,结果是99.那么,我在macOS上的步骤出错了什么?