Какова цель отсортированного битового векторного поля в заголовке метаданных "~" в сборке .NET? - PullRequest
3 голосов
/ 25 октября 2009

Согласно метаданным Раздела II, в нем говорится, что действительное поле является битовой маской, которая отмечает, какие таблицы метаданных CLR присутствуют в исполняемом файле .NET, но что я не могу понять, так это то, что поле "отсортировано" для - каково его значение и что я должен указать в этой области при создании собственных переносимых исполняемых образов .NET?

Ответы [ 2 ]

1 голос
/ 25 октября 2009

Я думаю, что отсортированное поле просто намекает, отсортирована ли конкретная таблица метаданных или нет (это битовое поле, как и в действительности).

Это позволило бы реализации среды выполнения выполнять двоичный поиск в таблице непосредственно из данных memmapped.

0 голосов
/ 25 октября 2009

РЕДАКТИРОВАТЬ: Это не ответ, я неправильно прочитал вопрос как о поле «Действительный», а не поле «Сортировка», но я оставляю его здесь на случай, если он связан с ответом

Поле «Действительный», о котором вы говорите, описано в Раздел II , § 24.2.6, с соответствующей частью следующим образом:

Поле Valid - это 64-битный битовый вектор, в котором для каждой таблицы, хранящейся в потоке, установлен определенный бит; отображение таблиц на индексы дано в начале §22. Например, когда таблица DeclSecurity присутствует в логических метаданных, бит 0x0e должен быть установлен в допустимом векторе. Недопустимо включать несуществующие таблицы в Valid, поэтому все биты выше 0x2c должны быть равны нулю.

Каждый подраздел раздела 22, начинающийся с §22.2, описывает одну таблицу и дает ее битовый индекс. Например, § 22.2 называется «Сборка: 0x20». Это означает, что, если и только если таблица сборки, описанная в §22.2, присутствует в вашем PE, тогда бит 0x20 должен быть установлен в поле Valid. Обратите внимание, что это НЕ означает, что Valid & 0x20 == 0x20, это означает, что должен быть установлен 0x20-й (т. Е. 32-й) бит Valid, то есть Valid & (1 << 0x20) == (1 << 0x20).

Некоторое время я не был уверен, был ли он индексирован 0 или 1, поэтому я предположил 0-индексированный. Но теперь я точно знаю, что он индексируется 0, потому что таблица модулей - это таблица 0x00.

...