Microsoft PE / COFF SPEC (v8, раздел 5.4.4) говорит, что когда символ имеет:
- Класс хранения IMAGE_SYM_CLASS_EXTERNAL
- И номер раздела 0 (IMAGE_SYM_UNDEFINED)
Это поле «значение» (в таблице символов), которое «указывает размер».
Это смущает меня. В частности, мне интересно, «указывает размер чего?».
Как правило, IMAGE_SYM_CLASS_EXTERNAL
и IMAGE_SYM_UNDEFINED
используются CL (Visual C ++) для представления внешних объектов.
Почему компоновщик должен знать или заботиться о размере символа? Разве ему просто не нужно знать имя, это extern и иметь соответствующие записи перемещения? Ничто из этого не должно зависеть от размера. По общему признанию, компилятор должен знать это, но он получит эту информацию из файла заголовка, а не из объектного файла.
Я рассмотрел несколько простых примеров externs, скомпилированных CL, и поле Value всегда кажется нулевым. Таким образом, он явно не используется для кодирования размера поля.
Кто-нибудь знает, на какой «размер» ссылается спецификация? Есть ли в них какие-либо сценарии, в которых компоновщик Visual Studio может использовать это поле, или это явная ошибка в спецификации? Мой ограниченный мозг не может придумать ни одного такого сценария.
* * 1023 Обновление: 1025 **
Обратите внимание, что это, по крайней мере, не всегда, размер символа. В тех случаях, когда я наблюдал, ЗНАЧЕНИЕ ВСЕГДА 0 , отсюда и вопрос.