Опция линкера/атрибут секции "X" ?

Тема в разделе "WASM.WIN32", создана пользователем ormoulu, 19 окт 2020.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Помните это?
    Код (Text):
    1. /SECTION:.text,EWRX
    Что означало X и куда оно делось в новых компиляторах?
     
  2. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    ormoulu, в сорцах видел такое, но тогда неясно, что такое Е.
    if(header.Characteristics & IMAGE_SCN_MEM_EXECUTE)
    std::cout << "X ";
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    ormoulu,
    Внимательно читаю https://docs.microsoft.com/en-us/cpp/build/reference/section-specify-section-attributes?view=vs-2019 и почему-то не вижу Х :scratch_one-s_head:
    Опция командной строки компоновщика link.exe /SECTION:name,[[!]{DEKPRSW}][,ALIGN=#] позволяет принудительно назначать атрибуты секциям PE-файла. Для секции можно задать один или несколько атрибутов. Следует задавать все атрибуты, которые должна иметь секция; если какой-либо знак атрибута не указан, то его бит будет отключен. Если не указан атрибут R, W или E, то существующее состояние чтения, записи или исполнения остается неизмененным. Чтобы инвертировать атрибут, перед его символом указывают знак «!». С помощью параметра ALIGN=# можно задать значение выравнивания для конкретной секции. Значения знаков атрибутов приведены в следующей таблице.
    букваатрибутзначениеперевод
    DDiscardableMarks the section as discardableСекция помечается как выгружаемая
    EExecuteThe section is executableСекция является выполняемой
    KCacheableMarks the section as not cacheableСекция помечается как некэшируемая
    PPageableMarks the section as not pageableСекция помечается как секция без страничной организации
    RReadAllows read operations on dataДопускаются операции чтения данных
    SSharedShares the section among all processes that load the imageСекция совместно используется всеми процессами, загружающими образ
    WWriteAllows write operations on dataДопускаются операции записи данных
    В данном случае секции с именем «.text» (содержащей код программы) и уже имеющей атрибуты R (доступна для чтения) и E (исполнимая), устанавливается атрибут W (доступна для записи)
     
    Последнее редактирование: 20 окт 2020
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    В этом и дело, линковщик от 2012 студии этот атрибут уже не принимает. От VS6 принимает, но я пока не вижу различий с ним и без него.
    --- Сообщение объединено, 20 окт 2020 ---
    UPD: опция добавляет к атрибутам секции флаг 0x400, названный в старых спецификациях IMAGE_SCN_TYPE_OVER, но даже там он помечен как "Reserved for future use".
    У кого под рукой есть сорсы NT4/2k, посмотрите пожалуйста, где-то используется?
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    ormoulu,
    в таблице секций по смещению +24h от 8 символьного имени секции находится 4 байтовый атрибут секции
    НазваниеЗначениеОписание
    IMAGE_SCN_CNT_CODE00000020hСекция содержит исполняемый код.
    IMAGE_SCN_CNT_INITIALIZED_DATA00000040hСекция содержит инициализированные данные.
    IMAGE_SCN_CNT_UNINITIALIZED_DATA00000080hСекция содержит неинициализированные данные.
    IMAGE_SCN_MEM_DISCARDABLE02000000hСекция может быть удалена из памяти после создания процесса.
    IMAGE_SCN_MEM_NOT_CACHED04000000hСекция не может кэшироваться.
    IMAGE_SCN_MEM_NOT_PAGED08000000hСекция не может выгружаться в файл подкачки.
    IMAGE_SCN_MEM_SHARED10000000hВсе копии данного файла могут иметь один общий экземпляр этой секции. По-видимому, используется только для секций данных динамических библиотек.
    IMAGE_SCN_MEM_EXECUTE20000000hСекцию можно исполнять как программный код.
    IMAGE_SCN_MEM_READ40000000hСекцию можно читать.
    IMAGE_SCN_MEM_WRITE80000000hВ секцию можно писать.
    теперь смотрим на старший байт атрибута, IMHO этот байт и формируется при использовании ключа " /SECTION"
    название hexbinОписание
    wrespkdx
    IMAGE_SCN_LNK_NRELOC_OVFL
    01000000h​
    01​
    00000001Секция содержит дополнительные данные о таблице перемещений.
    Section contains eXtended relocations.
    IMAGE_SCN_MEM_DISCARDABLE
    02​
    00000010Секция может быть удалена из памяти после создания процесса
    IMAGE_SCN_MEM_NOT_CACHED
    04​
    00000100Секция не может кэшироваться
    IMAGE_SCN_MEM_NOT_PAGED
    08​
    00001000 Секция не может выгружаться в файл подкачки
    IMAGE_SCN_MEM_SHARED
    10​
    00010000 Все копии данного файла могут иметь один общий экземпляр этой секции. По-видимому, используется только для секций данных динамических библиотек
    IMAGE_SCN_MEM_EXECUTE
    20​
    00100000Секцию можно исполнять как программный код
    IMAGE_SCN_MEM_READ
    40​
    01000000Секцию можно читать
    IMAGE_SCN_MEM_WRITE
    80​
    10000000В секцию можно писать
     
    Последнее редактирование: 20 окт 2020
  6. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Прошу прощения, косяк вышел.
    Флаг устанавливается не 0x400, а 0x40000 (20 00 04 E0 == 0xE0040020).
    Соответственно это IMAGE_SCN_MEM_LOCKED. Что он означает тоже не совсем понятно, но могу предположить что "X" тут от "fixed memory" :umnik2: М.б. какая-нибудь невыгружаемая память, если конечно такой механизм выгрузки когда-то существовал.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    ormoulu,
    старшая половина 3-его байта атрибута отвечает за выравнивание для конкретной секции
    названиеhex
    IMAGE_SCN_ALIGN_1BYTES2000.10.00.00
    IMAGE_SCN_ALIGN_2BYTES2100.20.00.00
    IMAGE_SCN_ALIGN_4BYTES2200.30.00.00
    IMAGE_SCN_ALIGN_8BYTES2300.40.00.00
    IMAGE_SCN_ALIGN_16BYTES2400.50.00.00
    IMAGE_SCN_ALIGN_32BYTES2500.60.00.00
    IMAGE_SCN_ALIGN_64BYTES2600.70.00.00
    IMAGE_SCN_ALIGN_128BYTES2700.80.00.00
    IMAGE_SCN_ALIGN_256BYTES2800.90.00.00
    IMAGE_SCN_ALIGN_512BYTES2900.A0.00.00
    IMAGE_SCN_ALIGN_1024BYTES21000.B0.00.00
    IMAGE_SCN_ALIGN_2048BYTES21100.C0.00.00
    IMAGE_SCN_ALIGN_4096BYTES21200.D0.00.00
    IMAGE_SCN_ALIGN_8192BYTES21300.E0.00.00
     
  8. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Нуу да, а младшая это
    Код (Text):
    1. //      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
    2. #define IMAGE_SCN_MEM_PURGEABLE              0x00020000
    3. #define IMAGE_SCN_MEM_16BIT                  0x00020000
    4. #define IMAGE_SCN_MEM_LOCKED                 0x00040000
    5. #define IMAGE_SCN_MEM_PRELOAD                0x00080000
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    ormoulu,
    при помощи link Version 14.16.27027.1 создаю файл с опцией /SECTION:.text,W,ALIGN=# меняю значения # от 1 до 8192, атрибут секции остается =80.00.00.20h. Похоже что это рудимент старых линковщиков, на который новым линковщикам наплевать и забыть :)
     
  10. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Mikl___, у меня есть личная просьба к вам и она, как бы, немного родственная этому топику, поэтому напишу здесь. Можно от вас получить готовую папочку или архив с MASM64, чтобы скопировать ее в нужное место и можно сразу работать. Боюсь, что установлю все эти ml64.exe, link.exe и т.п. да версии какие-нибудь не те, да плюс там же еще нужны инклуды и т.п. А от вас-то это была бы гарантия того, что дистрибутив (или как его правильно назвать) с MASM64 - "некривой". ))

    P.S. OS Win7x64.
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    GRAFik (extravert),
    для начала внимательно прочитайте Глава первая. Как Братец Кролик достал пакет MASM64 (или, как создать IDE из говна и палок)
    Для получения самых новых версий ml64.exe и link.exe вам придется установить Visual Studio 2019 (для частных лиц студия бесплатная, а скоро появится и Visual Studio 2021, так что, процесс придется повторять;)). Дело в том, что ml64.exe и link.exe ссылаются на кучу api-ms-*.dll, которые, после установки Visual Studio 2019, появятся у вас в Windows/System32
    Инклюды и либы я делаю сам из системных dll. Об этом в Глава вторая. Прототип нашей IDE В прикрепленных zip-файлах содержимое папок bin, include и lib. На картинке показано, как эти папки должны быть расположены. Папка samles для ваших экспериментов с программами.
    00.png
     

    Вложения:

    • bin.zip
      Размер файла:
      490,6 КБ
      Просмотров:
      214
    • lib.zip
      Размер файла:
      304 КБ
      Просмотров:
      212
    • include.zip
      Размер файла:
      410,1 КБ
      Просмотров:
      229
    GRAFik нравится это.