使用objcopy从共享库中剥离符号不会有任何作用

Stripping symbols from shared library with objcopy does nothing

本文关键字:符号 不会有 任何 作用 剥离 objcopy 共享 使用      更新时间:2023-10-16

第(1)个问题:
我有一个共享库shared1.so,它使用一个静态库static1.a
我有另一个共享库shared2.so
由于限制,shared2.so不能直接与static1.a链接
我希望shared2.so使用static1.a

我的解决方案
我在shared1.so中导出了static1.a函数,现在shared2.so通过与shared1.so链接使用static1.a函数。这还可以
然而,我最终发现所有的static1.a符号都出现在shared1.so中。

第二个问题
如何摆脱shared2.so未使用的所有这些符号/函数
我试过了:

arm-linux-androideabi-objcopy --strip-symbols symbols_of_static1_which_i_dont_use.txt shared1.so

但是它没有任何作用,也没有任何警告(即使使用-v)
我也试过使用arm-linux-androideabi-strip,但它不会剥离任何东西。

编辑:

因此,strip似乎只剥离了静态符号,而没有触及.dynsym部分。我仍在寻找一种方法来删除static1.a中所有不必要的符号,这些符号现在在shared1.so 中导出

然而,我最终得到了所有的static1.a符号出现在shared.so 中

你没有解释你是如何链接shared1.so的。通过更智能的链接,您可以从一开始就避免在shared1.so中有多余的static1.a符号(这可能比去掉符号更可取,因为如果不使用额外的符号,它们就会毫无理由地膨胀shared1.so)。

第一个问题仍然存在。

但你已经找到了解决方案,不是吗?

strip只剥离静态符号,不接触.dynsym部分

这是正确的。链接后很难修改dynammic符号表,因为符号出现在哈希表中。

如果您想从shared1.so中省略某些符号,并且一开始就无法避免将它们链接到中,那么最好使用链接器脚本将符号可见性限制为您希望可见的符号。实例

更新:

但是,如何将其与__attribute__ ((visibility ("default")))的用法结合起来呢?链接器脚本似乎覆盖了我使用该设置导出的函数。

正确:链接器脚本覆盖所有内容。

如果你已经在使用属性来控制符号可见性,那么你可以

  • __attribute__((visibility("hidden"))添加到您不想要的符号中,或者
  • 用CCD_ 26标志编译
相关文章: