GCC连接错误:版本节点没有找到符号

问题描述:

我试图构建一个共享库,我也得到了以下错误:GCC连接错误:版本节点没有找到符号

libavformat.so: version node not found for symbol [email protected]_52

ld: failed to set dynamic section sizes: Bad value

有谁知道这个错误是什么意思?主机是i586的Linux的目标是arm-linux的

编辑:解决,看评论

+1

请张贴的gcc你使用两种编译和链接的参数。 – 2010-06-28 14:44:42

+0

我摆脱了错误 - 它是特定于库,由内置Assey.symver指令 – ognian 2010-06-28 14:54:15

+1

引起的,您可以在此处发布解决方案作为回答 – 2010-06-28 14:55:18

它是由一条内联汇编指令.symver引起的。我的解决方案是手动修改生成的config.h以禁用版本节点符号。

退房internal.h线214-223

它拿了别人指出这一点给我,所以我想我还不如把它放在这里,以便其他人喜欢我能理解ognian的回答是:

这相当于编辑config.h运行./configure并使SYMVER - 相关条目设置为0,像这样经过:

#define HAVE_SYMVER 0 
#define HAVE_SYMVER_GNU_ASM 0 
#define HAVE_SYMVER_ASM_LABEL 0 

哦,功能was moved in April 2009libavformat/util.clibavcodec/avpacket.c中的新文件。该comment in internal.h国家明确:

If a function is moved from one library to another, a wrapper must be retained in the original location to preserve binary compatibility.

但它是不可能的,当一个函数库之间移动时保持二进制兼容性。

请注意,一年多前在Chromium project中报告了此错误。

顺便说一句,没有必要手动编辑config.h:您可以运行./configure --disable-symver

+1

实际上,在本版本中使用的FFmpeg版本中(r25864从2010年12月开始),'--disable-symver'选项不存在,所以手动编辑是必需的。不过,我很高兴听到关于配置选项的消息!当我们切换到更新的FFmpeg或Libav时,我会使用它。 – Nathan 2011-12-06 21:52:14

我在将libsctp构建到自定义构建环境时遇到了此错误。

符号版本控制被解释为here并且可以使用链接描述文件来控制它。在我来说,我是能够通过向特定目标LDFLAGS的Makefile变量在现有版本的链接脚本拉:

$(LIB_PATH)/libsctp.so: LDFLAGS += \ 
    -Xlinker --version-script=$(MODULE_PATH)/src/lib/Versions.map