链接时间优化导致的问题是带有ASM常量的未定义符号

|| 我正在用llvm-gcc-4.2.1。编译mplayer。 使用\'-O1 \'(禁用链接时间优化),程序可以成功编译和链接。对于\'-O2 \'或\'-O1 -flto \',ld抱怨未定义符号: 体系结构x86_64的未定义符号:   \“ _ MM_FIX_0_707106781 \”,引用自:       _filter在vf_fspp.o中   \“ _ MM_FIX_0_541196100 \”,引用自:       _filter在vf_fspp.o中 ld:找不到架构x86_64的符号 collect2:ld返回1退出状态 仅供参考,我的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使脚本调用\'cc \'进行编译,期望cc == gcc。我的系统不是这种情况; cc被链接到gcc的某些不同版本。一旦我将cc符号链接到gcc,就可以使用-O4进行编译(在默认的mplayer configure脚本中设置)。 结论:配置不正确的编译器工具在链接时引起冲突。通过在构建的所有阶段使用相同的编译器来解决。 编辑:实际上llvm-gcc仍然会因-O4失败,但是其他编译器(gcc-4.5.2和gcc42,这是Apple的gcc版本)成功了。其他两个编译器都不接受-flto标志,因此链接时间优化仍然失败。我至少很高兴可以使用-O2,-O3等进行编译,这是促使我提出这个问题的主要原因。 当然,我希望能够使用llvm-gcc编译器(在-O1以上的水平),但是您应该考虑半解决此问题,因为其他两个编译器正在与此代码一起正常工作。     
好吧,这绝对是一个错误。如果您认为这是编译器错误,则可以选择以下几种方法: 向Apple的bugtracker报告,因为您似乎正在使用XCode附带的llvm-gcc 尝试获取树顶的llvm和llvm-gcc(到现在为止,btw已弃用),并尝试重现该问题(或替代地,获取clang)。如果复制-请填写LLVM PR。 这通常是处理编译器错误的方式:) 但是,在我看来,该错误在源代码中。在这里,您假设最终对象中与此静态常量对应的符号名称将采用某种形式。通常这是实现定义的东西,编译器可以以任意方式更改名称(因为它是静态的,因此-在外部不可见)。 尝试删除\“ static \”,并检查是否仍然存在该问题。或者(这是正确的方法),您应该修复内联汇编程序,并通过内联汇编程序操作数提供常量。     
llvm-link中有一个错误-它不考虑来自嵌入式asm的符号。除了从C中同一模块的某个地方引用相同的符号外,我不知道任何合适的解决方法。如果您要进行单独的编译,那么这不是问题,因为使用了本机链接程序。对于LTO,将使用LLVM链接器,这是有缺陷的。 编辑:我没有注意到
static
,这意味着内联汇编和符号都在同一模块中,这是一个不同的错误。     
以下允许ffmpeg-0.8在我的系统上编译:
./configure --cc=i686-apple-darwin10-gcc-4.2.1 --enable-gpl --enable-nonfree
    

要回复问题请先登录注册