【问题标题】:"No symbol version section for versioned symbol"“版本化符号没有符号版本部分”
【发布时间】:2013-03-08 22:46:25
【问题描述】:

我正在尝试将我自己的共享库 (libmystuff.so) 与另一个使用 libcurl 共享库的共享库 (libtheirstuff.so) 交叉编译,但出现以下错误:

libmystuff.so: No symbol version section for versioned symbol 
'curl_global_init@@CURL_OPENSSL_3'

然后是:

final link failed: Nonrepresentable section on output.

查看创建 libtheirstuff 的代码,我可以看到 curl_global_init 是对 curl 的第一个引用。

在目标平台(arm5)上做ldd libtheirstuff.so表明它可以找到所有的引用。

这是怎么回事?

编辑:这里是对 gcc 的调用

arm-none-linux-gnueabi-gcc -fPIC -c mystuff_impl.c -o mystuff_impl.o -I/home/me/arm/include
arm-none-linux-gnueabi-gcc -shared -Wl,soname=libmystuff.so -o libmystuff.so.0.1 mystuff_impl.o -L/home/me/arm/lib -ltheirstuff

【问题讨论】:

  • 这可能是您链接库的顺序吗?
  • 我只链接一个库。请参阅编辑以了解对 gcc 的调用。
  • 看起来其他人也有类似的问题。也许需要使用另一个版本的 curl 库,与他们的库兼容。

标签: c linux gcc curl cross-compiling


【解决方案1】:

链接器抓取了错误的版本。

【讨论】:

    【解决方案2】:

    当您尝试编译可在多个 Linux 发行版上运行的二进制文件时,也会出现此问题 (No symbol version section for versioned symbol 'curl_global_init@@CURL_OPENSSL_3')。您可以像这样检查问题:

    $ objdump -x mybinary | grep curl_global_init
    0... F *UND*  0... curl_global_init@@CURL_OPENSSL_3
    

    这种情况下的解决方案是在使用./configure --disable-versioned-symbols 编译libcurl 的机器上构建。以这种方式编译的二进制文件将在其他地方工作(包括在使用版本符号的系统上)。一个可移植的二进制文件应该产生这样的输出(没有任何@ 符号):

    $ objdump -x mybinary | grep curl_global_init
    0... F *UND*  0... curl_global_init
    

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2013-06-23
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多