ELF的.notes节真的必要吗?

12

在Linux上,我正在尝试剥离一个静态链接的ELF文件,只保留最基本的部分。当我运行以下命令时:

strip --strip-unneeded foo
或者
strip --strip-all foo

转换后的文件仍然有一个肥大的.notes节,似乎充满了奇怪的字符串。

.notes节是否真的需要?我可以安全地使用--remove-section来强制删除它吗?

感谢任何帮助。

1个回答

11
从经验和查看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无法确认是否可以安全地将其删除。但根据我所提取的信息,如果它是您自己的程序,则几乎可以肯定地安全删除它。


谢谢Dan。我明白了。 - srking
一些关于 .note.gnu.build-id 的参考资料:https://fedoraproject.org/wiki/Releases/FeatureBuildId 以及人们对此的操作:https://lkml.org/lkml/2011/12/15/162。 - pfalcon
3
strip命令的作用是从二进制文件中删除指定的部分,其中 <binary> 是指要操作的二进制文件。具体来说,上述命令的意思是从二进制文件中删除名为 .note.gnu.build-id 的部分。 - J T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接