使用objcopy从共享库中剥离符号不会有任何作用
Stripping symbols from shared library with objcopy does nothing
第(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标志编译
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- C4018:类内有符号、无符号不匹配
- 有没有一个迭代器的例子,它不会使用 ptrdiff_t 作为其difference_type?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- C++单例,不会为此文档加载任何符号
- 如果有换行符,clang 格式不会附加大括号
- 堆指针不会被分配给数组有什么原因吗
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- GCC 中使用 -O3 的共享库编译不会导出与 -O0 中那样多的符号
- 是否有一种方法可以调用一个函数,而不会创建变量,而不会创建变量
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 是否有可能避免最终不会运行的 c++ 模板函数部分中的错误?
- 我正在做一个有空隙的程序。其中一个不会出现吗?
- 是否有可能存在不会崩溃程序的内存问题
- 静态库中的符号有时会链接到可执行文件中,有时则不会
- 有没有办法做 (A*B) mod M 而不会溢出无符号长 A 和 B
- 我的变量不会有任何值
- 覆盖运算符 =,以便我们可以使用 = 复制类实例,而不会有浅层复制问题
- 使用objcopy从共享库中剥离符号不会有任何作用
- 为什么使用 UTF8 在字符串文本中字符串化欧元符号不会生成 UCN