Исходя из опыта и просмотра справочной страницы для strip
, похоже, что strip
не предполагается, чтобы избавляться от всех без исключения разделов и строк, которые не нужны; просто символы. Процитируйте страницу руководства:
GNU strip discards all symbols from object files objfile.
При этом, исходя из опыта, strip
, даже без --strip-all
, удаляет ненужные для загрузки разделы, такие как .symtab
и .strtab
, и вы можете, как вы заметили, удалить нужные разделы с помощью --remove-section
.
В качестве примера раздела .notes
я взял /bin/ls
из своего 64-битного Ubuntu 11.10:
$ 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
не может знать, что их безопасно удалить. Но, судя по информации внутри той, которую я взял выше, если это ваша собственная программа, ее почти наверняка безопасно удалить.
person
Dan Fego
schedule
23.02.2012