在 Linux 上,我试图将静态链接的 ELF 文件剥离为基本要素。当我运行时:
strip --strip-unneeded foo
或者
strip --strip-all foo
生成的文件仍然有一个看起来充满时髦字符串的胖 .notes 部分。
.notes 部分是否真的需要,或者我可以用--remove-section 安全地强制它吗?
谢谢你的帮助。
从经验和查看手册页strip
来看,看起来strip
不应该删除任何和所有不需要的部分和字符串;只是符号。Quoth手册页:
GNU strip discards all symbols from object files objfile.
话虽如此,根据经验,strip
即使没有 ,也会--strip-all
删除不需要加载的部分,例如.symtab
and .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
不知道删除它们是否安全。但根据我上面获取的信息,如果它是你自己的程序,几乎可以肯定删除它是安全的。