2012-02-22 59 views
4

在Linux上,我试图剥离一个静态链接的ELF文件到最基本的要领。当我运行:ELF .notes部分是否真的需要?

strip --strip-unneeded foo 

strip --strip-all foo 

生成的文件仍然有似乎是充满时髦的字符串的脂肪.notes部分。

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

感谢您的任何帮助。

回答

5

从以往的经验,并从该名男子页寻找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不知道它是安全的删除它们。但是根据我上面提到的信息,如果它是你自己的程序,那么删除它几乎肯定是安全的。

+0

谢谢丹。我感觉合理。 – srking 2012-02-24 03:58:58

+0

对.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

+1

strip --remove-section = .note.gnu.build-id 2014-10-30 16:29:54

相关问题