для Microsoft PE/COFF SPEC (v8, раздел 5.4.4) говорит, что, когда символ имеет:Хотите узнать больше о COFF экстернов
класс- хранилищем IMAGE_SYM_CLASS_EXTERNAL
- и раздел число 0 (IMAGE_SYM_UNDEFINED)
Это поле «значение» (в таблице символов), которое «указывает размер».
Это меня смущает. В частности, мне интересно, «указывает размер чего?».
Как правило, IMAGE_SYM_CLASS_EXTERNAL
и IMAGE_SYM_UNDEFINED
используются CL (visual C++) для представления externs.
Зачем линкеру необходимо знать или заботиться о размере символа? Разве не нужно просто знать имя, что это extern, и есть ли соответствующие записи перемещения? Ничто из этого не должно зависеть от размера. Теперь, по общему признанию, компилятор должен это знать, но он получит эту информацию из файла заголовка, а не из объектного файла.
Я рассмотрел несколько простых примеров externs, скомпилированных CL, и поле Value всегда кажется равным нулю. Таким образом, он явно не используется для кодирования размера поля.
Кто-нибудь знает, к какому «размеру» относится спецификация? Есть ли в них какие-либо сценарии, в которых линкер-визуальная студия может использовать это поле, или это рекламный ролик в спекуляции просто абсурд? Мой ограниченный мозг не может думать о таких сценариях.
Update:
Пожалуйста, обратите внимание, что это не так, по крайней мере, не всегда, как представляется, размер символа. В случаях, которые я наблюдал, VALUE ВСЕГДА 0, отсюда и вопрос.
Значит, вы в своем «Обновить», что pSymbolTable-> SectionNumber> 0 (всегда ** NOT ** 0)? Декодирование pSymbolTable в случае (pSymbolTable-> StorageClass == IMAGE_SYM_CLASS_EXTERNAL && pSymbolTable-> SectionNumber> 0) не является проблемой. Проблема заключается только в том, что pSymbolTable-> SectionNumber == 0, то есть IMAGE_SYM_UNDEFINED. – Oleg