在Linux上,我正在尝试剥离一个静态链接的ELF文件,只保留最基本的部分。当我运行以下命令时:
strip --strip-unneeded foo
或者strip --strip-all foo
转换后的文件仍然有一个肥大的.notes节,似乎充满了奇怪的字符串。
.notes节是否真的需要?我可以安全地使用--remove-section来强制删除它吗?
感谢任何帮助。
strip
的手册来看,似乎strip
不应该摆脱所有不必要的部分和字符串,只是符号。引用手册中的话:
虽然如此,从经验来看,即使没有使用GNU strip discards all symbols from object files objfile.
--strip-all
参数,strip
也会删除一些不必要的部分,例如.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
无法确认是否可以安全地将其删除。但根据我所提取的信息,如果它是您自己的程序,则几乎可以肯定地安全删除它。