assembly - 链接时间优化问题导致带有 ASM 常量的 undefined symbol

标签 assembly constants undefined llvm symbols

我正在用 llvm-gcc-4.2.1 编译 mplayer。

使用“-O1”(禁用链接时间优化),程序成功编译和链接。使用“-O2”或“-O1 -flto”,ld 提示 undefined symbol :

Undefined symbols for architecture x86_64:
  "_MM_FIX_0_707106781", referenced from:
      _filter in vf_fspp.o
  "_MM_FIX_0_541196100", referenced from:
      _filter in vf_fspp.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

fyi, my version of ld:

@(#)PROGRAM:ld  PROJECT:ld64-123.2
llvm version 2.9svn, from Apple Clang 2.0 (build 137)

我将只关注 MM_FIX_0_707106781,因为其他常量都遵循相同的过程。

MM_FIX_0_707106781 使用宏初始化:
DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_707106781)=FIX64(0.707106781, 14);

评估为:
static const uint64_t __attribute__((used, aligned (8))) MM_FIX_0_707106781=0x2d412d412d412d41;

这些常量在 asm 代码中使用:

#define MANGLE(a) "_"#a "(%%rip)"

__asm__ volatile (
...
"pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm7\n\t"
...
);

我在 asm 函数中遇到了类似(相同?)的问题,我可以通过添加以下内容来解决:".globl "LABLE_MANGLE(functionnamehere)"\n\t"在每个标签之前,但这些知识并没有帮助我处理这些 ASM 常量。

恐怕这是我能提供的尽可能多的信息。再一次,使用 -O1 可以编译、链接和运行代码。使用 -O2 时,链接器无法找到这些 asm 常量。

任何人都可以为这个问题提供解决方案吗?谢谢。

最佳答案

感谢所有花时间考虑我的问题的人,但是我刚刚意识到我搞砸了我的编译工具,现在可以正常编译了。

问题是 mplayer make 脚本调用 'cc' 来编译,期望 cc == gcc。我的系统不是这种情况。 cc 被符号链接(symbolic link)到一些不同版本的 gcc。一旦我将 cc 符号链接(symbolic link)到 gcc,我就可以使用 -O4 编译项目(在默认的 mplayer 配置脚本中设置)。

总之:不正确配置的编译器工具在链接时导致冲突。通过在构建的所有阶段使用相同的编译器来解决。

编辑:实际上 llvm-gcc 仍然因 -O4 而失败,但其他编译器(gcc-4.5.2 和 gcc42,这是 Apple 的 gcc 版本)成功。其他两个编译器都不接受 -flto 标志,因此链接时间优化仍然失败。我至少很高兴我可以使用 -O2、-O3 等进行编译,这是我提出这个问题的主要原因。

当然,如果我愿意的话,我希望能够使用 llvm-gcc 编译器(在 -O1 以上的级别),但是您应该考虑半解决这个问题,因为其他两个编译器可以正常使用此代码。

关于assembly - 链接时间优化问题导致带有 ASM 常量的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5338068/

相关文章:

c - static const 和 const 有什么区别?

objective-c - 某种外部变量与静态变量之间的区别

JavaScript onchange 函数未定义?

assembly - 如何在气体汇编代码中导出类型为 "FUNC"和 "GLOBAL"的符号?

c++ - 如何在另一个正在运行的进程中找到自定义函数的地址以 Hook /绕行?

c++ - 在类构造函数中初始化常量 vector (C++)

jquery - 该对象 "undefined"

c++ - 在 MS x64 调用约定中,是否需要为 WinAPI 调用创建影子空间?

c - "functions"是 x86 硬件的基本部分吗?

Javascript:使用 "label"时出现奇怪的语法错误