Действительно ли существует ограничение на имя раздела в двоичных файлах PE?

Одна потрясающая статья о состояниях формата PE последующий:

Имя. Каждый заголовок раздела имеет поле имени длиной до восьми символов, для которого первым символом должна быть точка.

Но я знаю несколько примеров, которые нарушают это, начиная с раздела .gnu_debuglink внутри двоичных файлов, которые имеют отдельные символы отладки в формате DWARF. Также DWARF .debug_arranges, .debug_info и другие нарушают это. (Для сравнения, имя «отдельного» раздела PDB — просто .debug.)

Поэтому я задаюсь вопросом, является ли эта статья просто устаревшей/неполной, или, может быть, это руководство для Windows, или никогда не было ограничений на длину имен разделов?

Также я был бы рад, если бы кто-нибудь указал мне на любую книгу о двоичных файлах PE/COFF (ELF тоже был бы хорош), более полную, чем онлайн-статьи, если она вообще существует. Или вообще о системном программировании — информация по этой теме очень скудная или устаревшая лет на 20+. :)


person login_not_failed    schedule 17.05.2017    source источник
comment
Был ли этот раздел в PE или в двоичном файле ELF?   -  person Margaret Bloom    schedule 17.05.2017
comment
@margaret-bloom, на физкультуре. Вопрос только о двоичных файлах PE, я добавил последнюю часть об ELF только для того, чтобы привлечь больше предложений по книгам. :)   -  person login_not_failed    schedule 17.05.2017
comment
Эти имена кажутся довольно линуксовыми, а Dwarf разрабатывался вместе с ELF (хотя теперь они независимы). Имена разделов PE по-прежнему ограничены 8 символами.   -  person Margaret Bloom    schedule 17.05.2017
comment
Для имени секции в PE всего 8 байт, после этого идет поле виртуального размера. Это не строка с произвольным ограничением длины, это qword, который содержит строковое значение.   -  person harold    schedule 17.05.2017
comment
@harold, но заглянув в отладчик, я вижу, что эти разделы с длинными именами имеют совершенно прекрасные виртуальные размеры без каких-либо тарабарских значений. (Двоичный файл — PE, но с этими разделами DWARF он был собран gcc mingw64 — вот откуда странность.)   -  person login_not_failed    schedule 17.05.2017
comment
Поле имени тогда, вероятно, выглядит как /4 или подобное   -  person harold    schedule 17.05.2017
comment
@harold о да, тогда это должен быть ответ. Даже код, с которым я сейчас работаю, распознает / в начале имени раздела: поле для имени действительно ограничено по размеру, но оно ссылается на какое-то другое поле, вероятно, из части COFF, для полного имени.   -  person login_not_failed    schedule 17.05.2017
comment
Деталей, кажется, мало, до сих пор я узнал больше о том, как это на самом деле работает, из исходного кода LLD (компоновщика LLVM), чем из каких-либо фактических объяснений (кажется, их нет?)   -  person harold    schedule 17.05.2017
comment
@harold Я не искал достаточно усердно, но, судя по тому, сколько информации я нашел по этой общей теме, не должно быть бестселлеров о системном программировании, лежащих десятками. Кстати, могу я попросить вас дать фактический ответ на этот вопрос? Потому что это действительно одно. Если не хотите, я просто отвечу сам, ссылаясь на ваши комментарии здесь.   -  person login_not_failed    schedule 17.05.2017


Ответы (2)


В COFF есть функция "длинных имен разделов" для поддержки имен разделов, которые не помещаются в поле имени раздела.

Для длинного имени раздела обычное поле имени раздела содержит имя, похожее на /4, обычно это /, за которым следует некоторое десятичное число в виде строки ASCII. Число, которое он кодирует, является смещением в таблице символов, поэтому PointerToSymbolTable (из заголовка файла) плюс это смещение.

person Community    schedule 17.05.2017

Нет ограничений на имена разделов в объектных файлах, но имена разделов не могут быть длиннее 8 байтов в исполняемых файлах. Из Microsoft Portable Executable and Common Спецификация формата объектного файла:

8-байтовая строка в кодировке UTF-8, дополненная нулями. Если строка имеет длину ровно 8 символов, завершающий нуль отсутствует. Для более длинных имен это поле содержит косую черту (/), за которой следует ASCII-представление десятичного числа, являющегося смещением в таблице строк. Исполняемые образы не используют таблицу строк и не поддерживают имена разделов длиннее 8 символов. Длинные имена в объектных файлах усекаются, если они передаются в исполняемый файл.

Обратите внимание, что загрузчик Windows PECOFF игнорирует имена разделов, поэтому они на самом деле не используются ни для чего, кроме простой формы отладочной информации.

Также имя не должно начинаться с точки. Это просто соглашение, используемое для того, чтобы они не конфликтовали с определенными пользователем символами.

person Ross Ridge    schedule 17.05.2017