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.