ormoulu, в сорцах видел такое, но тогда неясно, что такое Е. if(header.Characteristics & IMAGE_SCN_MEM_EXECUTE) std::cout << "X ";
ormoulu, Внимательно читаю https://docs.microsoft.com/en-us/cpp/build/reference/section-specify-section-attributes?view=vs-2019 и почему-то не вижу Х Опция командной строки компоновщика 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 (доступна для записи)
В этом и дело, линковщик от 2012 студии этот атрибут уже не принимает. От VS6 принимает, но я пока не вижу различий с ним и без него. --- Сообщение объединено, 20 окт 2020 --- UPD: опция добавляет к атрибутам секции флаг 0x400, названный в старых спецификациях IMAGE_SCN_TYPE_OVER, но даже там он помечен как "Reserved for future use". У кого под рукой есть сорсы NT4/2k, посмотрите пожалуйста, где-то используется?
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ОписаниеwrespkdxIMAGE_SCN_LNK_NRELOC_OVFL 01000000h0100000001Секция содержит дополнительные данные о таблице перемещений. Section contains eXtended relocations.IMAGE_SCN_MEM_DISCARDABLE0200000010Секция может быть удалена из памяти после создания процессаIMAGE_SCN_MEM_NOT_CACHED0400000100Секция не может кэшироватьсяIMAGE_SCN_MEM_NOT_PAGED0800001000 Секция не может выгружаться в файл подкачкиIMAGE_SCN_MEM_SHARED 1000010000 Все копии данного файла могут иметь один общий экземпляр этой секции. По-видимому, используется только для секций данных динамических библиотекIMAGE_SCN_MEM_EXECUTE 2000100000Секцию можно исполнять как программный кодIMAGE_SCN_MEM_READ4001000000Секцию можно читатьIMAGE_SCN_MEM_WRITE8010000000В секцию можно писать
Прошу прощения, косяк вышел. Флаг устанавливается не 0x400, а 0x40000 (20 00 04 E0 == 0xE0040020). Соответственно это IMAGE_SCN_MEM_LOCKED. Что он означает тоже не совсем понятно, но могу предположить что "X" тут от "fixed memory" М.б. какая-нибудь невыгружаемая память, если конечно такой механизм выгрузки когда-то существовал.
ormoulu, старшая половина 3-его байта атрибута отвечает за выравнивание для конкретной секции названиеhexIMAGE_SCN_ALIGN_1BYTES2000.10.00.00IMAGE_SCN_ALIGN_2BYTES2100.20.00.00IMAGE_SCN_ALIGN_4BYTES2200.30.00.00IMAGE_SCN_ALIGN_8BYTES2300.40.00.00IMAGE_SCN_ALIGN_16BYTES2400.50.00.00IMAGE_SCN_ALIGN_32BYTES2500.60.00.00IMAGE_SCN_ALIGN_64BYTES2600.70.00.00IMAGE_SCN_ALIGN_128BYTES2700.80.00.00IMAGE_SCN_ALIGN_256BYTES2800.90.00.00IMAGE_SCN_ALIGN_512BYTES2900.A0.00.00IMAGE_SCN_ALIGN_1024BYTES21000.B0.00.00IMAGE_SCN_ALIGN_2048BYTES21100.C0.00.00IMAGE_SCN_ALIGN_4096BYTES21200.D0.00.00IMAGE_SCN_ALIGN_8192BYTES21300.E0.00.00
Нуу да, а младшая это Код (Text): // IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000 #define IMAGE_SCN_MEM_16BIT 0x00020000 #define IMAGE_SCN_MEM_LOCKED 0x00040000 #define IMAGE_SCN_MEM_PRELOAD 0x00080000
ormoulu, при помощи link Version 14.16.27027.1 создаю файл с опцией /SECTION:.text,W,ALIGN=# меняю значения # от 1 до 8192, атрибут секции остается =80.00.00.20h. Похоже что это рудимент старых линковщиков, на который новым линковщикам наплевать и забыть
Mikl___, у меня есть личная просьба к вам и она, как бы, немного родственная этому топику, поэтому напишу здесь. Можно от вас получить готовую папочку или архив с MASM64, чтобы скопировать ее в нужное место и можно сразу работать. Боюсь, что установлю все эти ml64.exe, link.exe и т.п. да версии какие-нибудь не те, да плюс там же еще нужны инклуды и т.п. А от вас-то это была бы гарантия того, что дистрибутив (или как его правильно назвать) с MASM64 - "некривой". )) P.S. OS Win7x64.
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 для ваших экспериментов с программами.