在Linux上,我试图剥离一个静态链接的ELF文件到最基本的要领。当我运行:ELF .notes部分是否真的需要?
strip --strip-unneeded foo
或
strip --strip-all foo
生成的文件仍然有似乎是充满时髦的字符串的脂肪.notes部分。
.notes部分真的需要吗?或者我可以用--remove-section安全地强制它?
感谢您的任何帮助。
在Linux上,我试图剥离一个静态链接的ELF文件到最基本的要领。当我运行:ELF .notes部分是否真的需要?
strip --strip-unneeded foo
或
strip --strip-all foo
生成的文件仍然有似乎是充满时髦的字符串的脂肪.notes部分。
.notes部分真的需要吗?或者我可以用--remove-section安全地强制它?
感谢您的任何帮助。
从以往的经验,并从该名男子页寻找strip
,它看起来像strip
不应该摆脱任何和不需要的各个部分,并串;只是符号。答曰手册页:
GNU strip discards all symbols from object files objfile.
话虽这么说,从经验,strip
,即使没有--strip-all
,删除部分不需要的加载,如.symtab
和.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
不知道它是安全的删除它们。但是根据我上面提到的信息,如果它是你自己的程序,那么删除它几乎肯定是安全的。
谢谢丹。我感觉合理。 – srking 2012-02-24 03:58:58
对.note.gnu.build-id的一些引用是:https://fedoraproject.org/wiki/Releases/FeatureBuildId以及人们对此做了什么:https://lkml.org/lkml/2011/12/ 15/162 – pfalcon 2012-09-22 17:09:55
strip --remove-section = .note.gnu.build-id –
2014-10-30 16:29:54