Есть код:
#include <iostream>
char __attribute__ ((section (".TST"))) buffer[0x20];
int main(int argc, char* argv[])
{
std::cout << "0x" << std::hex << (void*)buffer << std::endl;
return 0;
}
Получившийся в результате компиляции(g++) и линковки виндовый x86 экзешник работает корректно.
Если же добавляю линковщику флаг --section-start,.TST=0x500000, собравшийся .exe не запускается:
Посмотреть вложение 170497
Сравнил оба .exe файла, никаких серьезных различий не нашел. Например, вот отличия между IMAGE_OPTIONAL_HEADER32 рабочего .exe файла (слева) и нерабочего (справа). Отличия подчеркнул красным для удобства
Посмотреть вложение 170498
Тут все справедливо: все адреса после 0x4000 смещены, потому что по адресу 0x4000 располагается .TST секция
Также вот секционные заголовки рабочего (слева) и нерабочего (справа) экзешников:
Посмотреть вложение 170500
Тоже все выглядит нормально.
У меня было только одно предположение - в выравнивании. Явно укзаал линковщику выравнивание кратное 512 --section-alignment=0x1000 --file-alignment=0x1000. Не помогло.
Куда копать, в чем проблема?