Показать сообщение отдельно

  #2  
Старый 26.09.2022, 00:10
p1cador
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами: 6395080

Репутация: 128
По умолчанию

Есть код:

C++:





[CODE]
#include
char
__attribute__
(
(
section
(
".TST"
)
)
)
buffer
[
0x20
]
;
int
main
(
int
argc
,
char
*
argv
[
]
)
{
std
::
cout



Получившийся в результате компиляции(g++) и линковки виндовый x86 экзешник работает корректно.

Если же добавляю линковщику флаг --section-start,.TST=0x500000, собравшийся .exe не запускается:



Сравнил оба .exe файла, никаких серьезных различий не нашел. Например, вот отличия между IMAGE_OPTIONAL_HEADER32 рабочего .exe файла (слева) и нерабочего (справа). Отличия подчеркнул красным для удобства



Тут все справедливо: все адреса после 0x4000 смещены, потому что по адресу 0x4000 располагается .TST секция

Также вот секционные заголовки рабочего (слева) и нерабочего (справа) экзешников:



Тоже все выглядит нормально.

У меня было только одно предположение - в выравнивании. Явно укзаал линковщику выравнивание кратное 512 --section-alignment=0x1000 --file-alignment=0x1000. Не помогло.

Куда копать, в чем проблема?
 
Ответить с цитированием