COMDAT название раздела

Я пишу компоновщик для двоичных файлов Windows, и в настоящее время работаю над реализацией COMDAT. Я думаю, что понимаю большую часть спецификации, за исключением той из трех записей для раздела COMDAT (заголовок раздела, символы раздела и вспомогательный символ), в спецификации, похоже, не упоминается общее имя, хранящееся в какой-либо из них.

Другими словами, когда я запускаю dumpbin для такого объекта, он выдает следующее:

SECTION HEADER #8
.text$mn name
       0 physical address
       0 virtual address
       5 size of raw data
    2358 file pointer to raw data (00002358 to 0000235C)
    235D file pointer to relocation table
       0 file pointer to line numbers
       1 number of relocations
       0 number of line numbers
60301020 flags
         Code
         COMDAT; sym= cosl

Где этот последний элемент sym= cosl родом из? Или, если это просто обычный символ, указывающий на раздел, что произойдет, если на него будет несколько разных таких символов?

1 ответ

Решение

Согласно спецификации Microsoft PE и COFF, раздел 4.5.6 (которую, я уверен, вы внимательно прочитали, если пишете компоновщик), значение sym= является символом COMDAT, который используется компоновщиком в сочетании с значение Selection, чтобы определить, какую копию раздела COMDAT оставить в конечном изображении. Есть две записи в таблице символов для каждого раздела COMDAT. Первый имеет название раздела и вспомогательную запись с информацией о выборе. Значение символа COMDAT берется из второй записи в таблице символов для раздела COMDAT. Это либо значение ShortName символа, либо значение записи таблицы строк, на которую он указывает.

Значение символа COMDAT должно быть идентичным для всех копий одного и того же COMDAT в различных объектных файлах, которые будут связаны. В любом объектном файле должно быть только две записи таблицы символов с соответствующими номерами разделов для конкретного раздела COMDAT, если я правильно понимаю спецификацию. Вы не должны видеть несколько строк символов COMDAT с разными значениями в качестве записей таблицы символов для одного COMDAT.

Другие вопросы по тегам