使用objcopy从共享库中剥离符号不会做任何事情

时间:2014-11-06 18:01:42

标签: android c++ android-ndk shared-libraries symbols

(第一)问题:
我有一个共享库shared1.so,它使用的是静态库static1.a 我有另一个共享库shared2.so 由于限制,shared2.so无法与static1.a直接关联 我希望shared2.so使用static1.a

我的解决方案
我在static1.a中导出了shared1.so个功能,现在shared2.so通过链接static1.a正在使用shared1.so个功能。这工作正常!
不过,我最终在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部分。 我仍然在寻找一种方法来删除现在在shared1.so中导出的所有不必要的static1.a符号

1 个答案:

答案 0 :(得分:0)

  

但是我最终将所有static1.a符号出现在shared1.so

您没有解释如何关联shared1.so。有可能通过更智能地链接你可以避免在static1.a中首先出现无关的shared1.so符号(这可能比将符号剥离更好,因为如果不使用额外的符号,它们只会膨胀shared1.so没有充分理由)。

  

第一个问题仍然存在。

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

  

strip仅剥离静态符号,不触及.dynsym部分

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

如果您想省略shared1.so中的某些符号,并且您无法避免首先将它们链接起来,那么最好的办法是使用链接描述文件将符号可见性限制为您想要的符号可见。 Example

<强>更新

  

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

正确:链接描述文件会覆盖所有内容。

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

  • __attribute__((visibility("hidden"))添加到您不想要的符号或
  • 使用-fvisibility=hidden标志进行编译。