从仅由先验已知的一组可执行文件使用的共享库中剥离符号

问题描述 投票:0回答:1

是否有任何工具提供了从共享对象文件中删除未使用的符号的功能(给定一组(>1)依赖于此共享对象文件的 ELF 文件)?我的目标是一个嵌入式平台,我拥有/管理构建映像时依赖于该共享对象的所有 ELF。由于存储容量有限,我正在考虑删除未使用的代码。

我完全能够提取一组需要由 SO 提供的未定义符号(由一组库/可执行文件引用)。但我特别担心的是如何剥离它们,而不是意外地剥离可执行文件使用的全局符号引用的任何符号。

dynamic linker elf shared
1个回答
0
投票

是否有任何工具可以提供从共享对象文件中删除未使用的符号的功能

据我所知。

我的目标是一个嵌入式平台,我拥有/管理在构建映像时依赖于该共享对象的所有 ELF。

解决这个问题的最佳方法是

  1. 使用
    -fdata-sections -ffunction-sections
  2. 编译所有源代码
  3. 将所有对象链接到一个单个二进制文件中并使用
    -Wl,--icf=safe

这将保证只有所使用的代码被实际链接,并且将消除使用共享库的(有时非常重要)开销。

拥有单个二进制文件还有助于在目标上节省大量内存,因为(由于写入时复制)所有代码和大部分数据只会在内存中出现一次。

这是“busybox”方法。

附注

我拥有构建共享对象文件的进程,但我不拥有源代码。

如果您拥有构建过程,那么您可以在构建之前对源代码进行任意转换(即复制并使用sed

以任意方式更改源代码),因此您
do本质上拥有源代码还有。

© www.soinside.com 2019 - 2024. All rights reserved.