我正在用llvm-gcc-4.2.1编译mplayer。链接时间优化的问题导致带有ASM常量的未定义符号
使用'-O1'(禁用链接时间优化),程序成功编译和链接。随着 '-02' 或 '-O1 -flto',LD未定义符号的抱怨:
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
仅供参考,我的版本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;
这些常数在汇编代码用于:
#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常量。
任何人都可以提供解决这个问题?谢谢。
这是不正确的。这里常量被明确标记为“used”,所以它应该被优化器保存,而不管它被使用的地方。 – 2011-03-17 14:24:57
@Anton Korobeynikov,它似乎没有帮助,因为整个模块没有链接 - 从嵌入式asm的引用没有遵循。如果'__asm__'在一个模块中,并且常量在另一个模块中,并且后者在第一个模块之后被链接,就会发生这种情况。 – 2011-03-17 14:33:38
这是意图行为,编译器会像汇编文件一样对待汇编程序,所以您应该仔细通知它,您正在做一些奇怪的事情。使用静态变量(因为它没有外部可见性)是你肯定应该通知编译器的东西(在这种情况下 - 通过操作数)。 – 2011-03-20 19:26:11