我正在用 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/