【发布时间】:2020-06-11 15:20:06
【问题描述】:
这是我的问题,我尝试创建一个汇编函数库并将其与 C 程序一起使用。 我遇到了一个未定义的引用错误。
我在学校为这个项目提供的虚拟机上使用 xubuntu(所以我想一切都设置得很好......)
程序集文件 (ft_function.s)
section .text
global _ft_function
_ft_function:
mov rax, 42
ret
C 文件 (main.c)
extern int ft_function(char const *str);
int main()
{
return (ft_function("abc"));
}
现在问题仍然存在,我不创建库,以减少最简单的情况,所以我生成目标文件,然后用 clang 链接它们。
nasm -f elf64 ft_function.s -o ft_function.o
clang -c main.c
clang ft_function.o main.o
main.o: In function `main':
main.c:(.text+0x1a): undefined reference to `ft_function'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
感谢您的帮助! 干杯!
【问题讨论】:
-
对于 x86-64,您不需要在 MacOS 以外的平台上使用前导下划线。
-
确实,很抱歉发布了重复的问题,但由于不知道问题的开头,因此很难找到重复的问题。
-
不用道歉;您的问题包含足够的信息可以完全回答,只是碰巧其他人以前也遇到过同样的问题。对于知道答案的人来说,找到重复项是很正常的,否则就不是了。
-
我会指出错误消息包含一个提示:
undefined reference toft_function'` 在它提到的 asm 符号名称上没有前导下划线。但可能您认为它正在为您消除名称。而且您确实知道前导下划线是一个可能的问题,因此可以仔细检查。像往常一样,事后看来,很容易指出很多你自己可能已经解决的方法,但是 IMO 这个方法并不完全明显(不像一些问题,使用调试器单步执行和/或读取指令集参考会有问题很明显。)
标签: compiler-errors clang x86-64