如何解决链接时间优化导致的问题是带有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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。