【问题标题】:gcc linker error: version node not found for symbolgcc 链接器错误:找不到符号的版本节点
【发布时间】:2011-03-09 03:22:23
【问题描述】:

我正在尝试构建一个共享库,但出现以下错误:

libavformat.so:未找到版本节点 对于符号 av_dup_packet@LIBAVFORMAT_52

ld: 未能设置动态部分大小: 价值不高

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

编辑:已解决,见 cmets

【问题讨论】:

  • 请贴出你用于编译和链接的gcc参数。
  • 我摆脱了错误 - 它是特定于库的,由内联的 assemby.symver 指令引起
  • 您可以在此处发布解决方案作为答案

标签: c gcc shared-libraries ld


【解决方案1】:

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

查看internal.h 214-223 行

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      顺便说一句,config.h 不需要手动编辑:你可以运行./configure --disable-symver

      【讨论】:

      • 实际上,在我在这个版本中使用的FFmpeg版本(2010年12月的r25864)中,--disable-symver选项不存在,所以手动编辑是必要的。不过,我很高兴听到配置选项!当我们切换到更新的 FFmpeg 或 Libav 时,我会使用它。
      【解决方案4】:

      这需要别人给我指出来,所以我想我不妨把它放在这里,以便像我这样的其他人可以理解 ognian 的回答:

      这意味着在运行./configure 并将SYMVER 相关条目设置为0 之后编辑config.h。像这样:

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

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多