【问题标题】:Cannot compile x86_64 .s and .c files : undefined reference to function [duplicate]无法编译 x86_64 .s 和 .c 文件:未定义对函数的引用 [重复]
【发布时间】: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 to ft_function'` 在它提到的 asm 符号名称上没有前导下划线。但可能您认为它正在为您消除名称。而且您确实知道前导下划线是一个可能的问题,因此可以仔细检查。像往常一样,事后看来,很容易指出很多你自己可能已经解决的方法,但是 IMO 这个方法并不完全明显(不像一些问题,使用调试器单步执行和/或读取指令集参考会有问题很明显。)

标签: compiler-errors clang x86-64


【解决方案1】:
section .text
    global _ft_function

_ft_function:
    mov rax, 42
    ret

省略前导下划线。其他一些系统使用以下划线开头的符号名称,但 Linux 没有。做吧:

section .text
    global ft_function

ft_function:
    mov rax, 42
    ret

【讨论】:

  • 哈天哪,我一直在尝试一切,包括你提出的建议,但没有成功!但它现在确实有效,所以我想我在寻找修复时可能尝试了错误的解决方案组合!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2013-05-13
相关资源
最近更新 更多