2012-02-22 4 views
4

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

strip --strip-unneeded foo 

или

strip --strip-all foo 

Результирующий файл по-прежнему имеет .notes раздел жира, который появляется, чтобы быть полным фанки строк.

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

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

ответ

5

Из опыта и глядя на странице человека для strip, это выглядит как strip не должен избавиться от любых и всех разделов и строк, которые не нужны; только символы. Quoth человека странице:

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 не может знать, что их можно удалить. Но основываясь на информации внутри той, которую я взял выше, если это ваша собственная программа, почти наверняка ее можно удалить.

+0

Спасибо Dan. Имеет смысл для меня. – srking

+0

Некоторые ссылки на то, что .note.gnu.build-id: https://fedoraproject.org/wiki/Releases/FeatureBuildId и что люди делают с этим: https://lkml.org/lkml/2011/12/ 15/162 – pfalcon

+1

strip --remove-section = .note.gnu.build-id