Действительно ли нужен раздел ELF .notes?

В Linux я пытаюсь разделить статически связанный файл ELF до самого необходимого. Когда я бегу:

strip --strip-unneeded foo

or

strip --strip-all foo

В итоговом файле все еще есть толстый раздел .notes, который, кажется, заполнен фанковыми строками.

Действительно ли нужен раздел .notes, или я могу безопасно вытеснить его с помощью --remove-section?

Спасибо за любую помощь.


person srking    schedule 22.02.2012    source источник


Ответы (1)


Исходя из опыта и просмотра справочной страницы для 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
comment
Спасибо, Дэн. Для меня это имеет смысл. - person srking; 24.02.2012
comment
Некоторые ссылки на то, что такое .note.gnu.build-id: fedoraproject.org/wiki/Releases/FeatureBuildId и что с этим делают люди: это lkml.org/lkml/2011/12 / 15/162 - person pfalcon; 22.09.2012
comment
strip --remove-section = .note.gnu.build-id ‹binary› - person J T; 30.10.2014