在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