【问题标题】:Stripping symbols from shared library with objcopy does nothing使用 objcopy 从共享库中剥离符号无济于事
【发布时间】:2015-01-03 08:39:50
【问题描述】:

(第一个)问题:
我有一个共享库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 中导出

【问题讨论】:

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


    【解决方案1】:

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

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

    第一个问题仍然存在。

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

    strip 只去除静态符号,不触及 .dynsym 部分

    没错。链接后动态符号表很难修改,因为符号出现在哈希表中。

    如果您想从shared1.so 中省略某些符号,并且您无法避免首先将它们链接,那么您最好的选择是使用链接器脚本将符号可见性限制为您想要的符号可见的。 Example.

    更新:

    但是,如何将其与 __attribute__ ((visibility ("default"))) 的用法结合使用?链接描述文件似乎覆盖了我使用该设置导出的函数。

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

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

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

    【讨论】:

    • 非常感谢,使用链接器脚本我设法只导出了所需的功能。但是如何将其与__attribute__ ((visibility ("default"))) 的使用结合起来?链接描述文件似乎覆盖了我使用该设置导出的函数。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多