gcc链接器错误:找不到符号的版本节点

时间:2010-06-28 13:16:58

标签: c gcc shared-libraries ld

我正在尝试构建一个共享库,我收到以下错误:

  

libavformat.so:找不到版本节点   为符号   av_dup_packet @ LIBAVFORMAT_52

     

LD:   无法设置动态部分大小:   价值不佳

有人知道这个错误意味着什么吗?主机是i586-linux目标是arm-linux

编辑:已解决,请参阅评论

4 个答案:

答案 0 :(得分:3)

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

查看internal.h行214-223

答案 1 :(得分:2)

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

解释了符号版本控制here,并且可以使用链接描述文件来控制它。在我的情况下,我能够通过添加到特定于目标的LDFLAGS makefile变量来引入现有的版本链接器脚本:

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

答案 2 :(得分:1)

哦,libavformat/util.c中的was moved in April 2009函数到libavcodec/avpacket.c中的新文件。 comment in internal.h明确声明:

  

如果函数从一个库移动到另一个库,则必须在原始位置保留包装器以保持二进制兼容性。

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

请注意,这个错误是在一年多前Chromium project报告的。

顺便说一句,无需手动修改config.h:您可以./configure --disable-symver运行。

答案 3 :(得分:0)

其他人需要向我指出这一点,所以我想我也可以把它放在这里,所以像我这样的人可以理解ognian的回答:

这转换为在您运行config.h并将./configure - 相关条目设置为0后编辑SYMVER。如下所示:

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