11

在 Linux 上,我试图将静态链接的 ELF 文件剥离为基本要素。当我运行时:

strip --strip-unneeded foo

或者

strip --strip-all foo

生成的文件仍然有一个看起来充满时髦字符串的胖 .notes 部分。

.notes 部分是否真的需要,或者我可以用--remove-section 安全地强制它吗?

谢谢你的帮助。

4

1 回答 1

11

从经验和查看手册页strip来看,看起来strip应该删除任何和所有不需要的部分和字符串;只是符号。Quoth手册页:

   GNU strip discards all symbols from object files objfile.

话虽如此,根据经验,strip即使没有 ,也会--strip-all删除不需要加载的部分,例如.symtaband .strtab,并且您可以使用 . 删除您想要的部分--remove-section

作为一个.notes部分的示例,我/bin/ls从我的 Ubuntu 11.10 64 位机器中获取:

$ readelf -Wn /bin/ls

Notes at offset 0x00000254 with length 0x00000020:
  Owner                 Data size   Description
  GNU                  0x00000010   NT_GNU_ABI_TAG (ABI version tag)
    OS: Linux, ABI: 2.6.15

Notes at offset 0x00000274 with length 0x00000024:
  Owner                 Data size   Description
  GNU                  0x00000014   NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: 3e6f3159144281f709c3c5ffd41e376f53b47952

这包括.note.ABI-tag部分和.note.gnu.build-id部分。看起来它们包含加载程序不需要的数据,但也不是标准的,并且不知道strip对于程序的正确运行不是必需的,因为 ELF 可以有任意数量的附加无法安全删除的“未知”部分。因此,与其使用虚拟白名单(这可能会失败),不如使用它知道可以删除的部分的黑名单,并且这样做了。

短版:这些部分似乎不是标准的,可以用于各种事情,所以strip不知道删除它们是否安全。但根据我上面获取的信息,如果它是你自己的程序,几乎可以肯定删除它是安全的。

于 2012-02-23T15:53:13.567 回答