Я бездельничал с бесплатным компилятором Digital Mars на работе (я знаю, шалость), и создал некоторый код для проверки скомпилированных функций и просмотра байт-кода в учебных целях, чтобы узнать, смогу ли я узнать что-нибудь ценное из компилятор строит свои функции. Однако воссоздание того же метода в MSVC ++ с треском провалилось, и результаты, которые я получаю, весьма запутаны. У меня есть такая функция:
unsigned int __stdcall test()
{
return 42;
}
Потом я делаю:
unsigned char* testCode = (unsigned char*)test;
Я не могу заставить C ++ static_cast работать в этом случае (он выдает ошибку компилятора) ... отсюда приведение в стиле C, но это не главное ... Я также пытался использовать справка и тест, но это не помогает никому.
Теперь, когда я проверяю содержимое памяти, на которую указывает testCode, я запутался, потому что то, что я вижу, даже не похоже на допустимый код, и даже там застряла точка останова отладки ... это выглядит так ( цель - IA-32):
0xe9, 0xbc, 0x18, 0x00, 0x00, 0xcc ...
Это явно неверно, 0xe9 - инструкция относительного перехода, а если смотреть 0xbc байтов, это выглядит так:
0xcc, 0xcc, 0xcc ...
т.е. память инициализирована для кода операции точки останова отладки, как и ожидалось для нераспределенной или неиспользуемой памяти.
Где то, что я ожидаю от функции, возвращающей 42, будет примерно таким:
0x8b, 0x2a, 0x00, 0x00, 0x00, 0xc3
или, по крайней мере, какой-то вариант mov с последующим отступом (0xc2, 0xc3, 0xca или 0xcb) чуть ниже
MSVC ++ предпринимает шаги, чтобы помешать мне делать подобные вещи из соображений безопасности, или я делаю что-то глупое и не осознаю этого? Этот метод, кажется, работает нормально, используя DMC в качестве компилятора ...
У меня также возникают проблемы при переходе в другую сторону (выполнение байтов), но я подозреваю, что основная причина та же.
Любая помощь или советы будут с благодарностью.