【问题标题】:How to create .so shared libraries with undefined references - gcc如何使用未定义的引用创建 .so 共享库 - gcc
【发布时间】:2018-06-23 04:00:35
【问题描述】:

我继承了一个生成 .so 文件的 Makefile。它使用 gcc 4.7.4 在 Ubuntu 上与来自 OpenSSL 的 -lcrypto 链接。至关重要的是,它没有与-lssl-ldl 链接,当我运行nm -g thelib.so 时,它只有来自openssl 加密的~15 个符号。但是,它们都是U(未定义)。

我正在另一台 Ubuntu 机器上重构 Makefile。当我与-lcrypto 链接时,由于dl 需要未定义的符号而失败。当我添加到-ldl 的链接时,这些错误消失并且链接成功。但是,我的.so 文件比原始文件大1.5 MB,并且至少有一百个与SSL 相关的符号,它们都是T(已定义),这似乎表明-lssl 正在以某种方式隐式发生。

虽然在我的案例中定义它们似乎是谨慎和好的,但我需要弄清楚如何产生相同的结果。

所以,我的问题是,如何让 GCC 允许链接 .so 文件并接受未定义的引用?我比较了我们的命令,我试图消除一些差异,但似乎没有任何效果。我读到它可能与-Wl,--no-as-needed 有关,但我正在使用它。这是我的链接器标志。

g++ -shared -o mylib.so myobjs.o -fPIC -lstdc++ -lm -z defs -Wl,-soname,mylib -Wl,--no-as-needed -lpthread -lcrypto -lz

【问题讨论】:

  • 你知道这个g++链接器步骤最终使用的是哪个-lcrypto库吗?出于您的目的,它应该是一个动态库,而不是它的静态版本。
  • @ReinierTorenbeek 谢谢你,这显然是答案,我从 Ubuntu 安装了 openssl-devel,并与之链接,它工作正常。

标签: gcc openssl


【解决方案1】:

在另一个系统(结果较大的系统)上,OpenSSL 显然没有被构建为共享对象,仅作为静态库(但可能作为 PIC,以便您可以将结果链接到共享对象) .您必须安装提供共享对象的软件包和相应的.so 符号链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多