【问题标题】:How to add libgcc to .so file如何将 libgcc 添加到 .so 文件
【发布时间】:2016-07-15 14:00:34
【问题描述】:

我有一个第三方共享对象文件(库文件)a.so,但是当我这样做时 ldd -d -r a 它提供了许多未定义的符号,例如 undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE。我检查并用谷歌搜索发现这个符号来自标准libstdc++。所以为了让a.so 工作,我做了以下工作: g++ -fPIC -static-libgcc -L. -shared -o liba.so -Wl,-soname,liba.so -L. a.so 现在当我做ldd -d -r liba 时,我得到了所有的引用。 但这里的问题是我想与我的应用程序共享 liba.so,该应用程序将在不同的 linux 机器上运行,liba.so 找不到 a.so。 有没有一种方法可以通过将标准库和提供的第三方共享库添加到单个共享对象中来删除未定义的符号并且我可以使用?

【问题讨论】:

  • 使用 'nm' 实用程序找出这个符号的来源:libgcc_s.so 不是答案,因为它不包含与 C++ 相关的符号。 (我猜是 libstdc++.so)
  • 谢谢!!是的,你的猜测是正确的,它是 libstdc++.so
  • 您实际测试过这个a.so 并遇到问题吗?您收到了哪些错误消息? (主程序是用 C++ 编写的吗?C++ 插件只能从 C++ 主程序中使用)

标签: c++ linker shared-libraries


【解决方案1】:

有没有一种方法可以通过添加标准库和提供的第三方共享库到单个共享对象中来删除未定义的符号并且我可以使用?

没有。在必须 UNIX 系统(AIX 除外)上,.so 是链接器的最终产品,无法进行进一步的链接操作。

现在,您的实际问题似乎是 libthird_party.so 在其 .dynamic 部分中不依赖于 libgcc_s.so.1可能可以使用ELF 编辑工具(例如elfsh link)对该库进行二进制修补。

最后,您实际上很可能没有首先要解决的问题。由于您使用自己的可执行文件发布此库,因此只要该可执行文件本身链接到 libgcc_s.so.1,则无论如何都会出现第 3 方库所需的符号。

【讨论】:

  • Java 代码 System.loadLibrary(libthird_party.so) 首先会调用,然后是我自己的可执行文件。我需要加载两个库。在第一次加载时我收到错误。
  • @user2018303 您的评论没有任何意义。您的可执行文件与 Java 有什么关系?
猜你喜欢
  • 2018-07-17
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多