Какова цель отсортированного битового векторного поля в & # 8220; ~ & # 8221; Заголовок метаданных в сборке .NET?

StackOverflow https://stackoverflow.com/questions/1619614

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

"Действительный" поле, о котором вы говорите, описано в Раздел II , & # 167; 24.2.6, с соответствующей частью следующим образом:

  

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top