在Linux上,我试图将静态链接的ELF文件剥离到最基本的东西。我跑的时候:
strip --strip-unneeded foo
或
strip --strip-all foo
结果文件仍然有一个胖的.notes部分,似乎充满了时髦的字符串。
.note部分真的需要,还是我可以用--remove-section安全地强制它?
感谢您的帮助。
答案 0 :(得分:6)
根据经验和查看strip
的手册页,看起来strip
不是假设来摆脱任何和所有的部分和字符串不需要;只需符号。手册页:
GNU strip discards all symbols from object files objfile.
话虽如此,根据经验strip
,即使没有--strip-all
,也会删除不需要加载的部分,例如.symtab
和.strtab
,您可以像请注意,使用--remove-section
删除您想要的部分。
作为.notes
部分的示例,我从我的Ubuntu 11.10 64位框中获取/bin/ls
:
$ 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
无法知道删除它们是安全的。但根据我上面提到的信息,如果它是你自己的程序,删除它几乎肯定是安全的。