|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 28, 2004 09:59:56 Не подскажете, как сделать следующее наиболее цивилизованным образом. Есть программа на асм, включающая FASM. Ей дается кусок кода на ассемблере. Надо этот кусок скомпилировать и запустить, не записывая на диск. |
|
|
Дата: Апр 28, 2004 10:17:31 · Поправил: johnfound В DOS возможно, а в Windows нет, AFAIK. Если говорим "запустить самостоятельно". А как часть етого процесса, надо только сделать память где код записан "executable". |
|
|
Дата: Апр 28, 2004 10:45:22 Не совсем понял, что именно можно, а что нельзя сделать под виндой? Вообще мне это нужно для прототипа интерпретатора, который критичные места компилит в ассемблер. |
|
|
Дата: Апр 28, 2004 11:04:43 Теоретически, если скоипиленый код запихать в память и из своей проги прыгнуть на начало кода в памяти, может получиться. Только область памяти, где лежит прога сделать executable (флаги выставить). Но для этого придется самому компилировать (всмысле твоя программа должна уметь компилить асм-код), так как все известные мне компиляторы не спрашивают куда компилить и сразу пишут на диск. |
|
|
Дата: Апр 28, 2004 11:33:07 Но для этого придется самому компилировать Ну, есть же исходники FASM:) Можно в нем в районе formatter покопаться. Но меня интересует еще как это сделать цивилизовано, без особых хаков. Например, можно ли код, скомпилированный как DLL подключить, не записывая в файл а только имея его в памяти? |
|
|
Дата: Апр 28, 2004 12:02:32 > не записывая в файл а только имея его в памяти Если я правильно понимаю идеологию виндос нт - нельзя. См., например, CreateFileMapping с INVALID_HANDLE_VALUE |
|
|
Дата: Апр 28, 2004 12:20:43 > можно ли код, скомпилированный как DLL подключить, не записывая в файл а только имея его в памяти? Можно. |
|
|
Дата: Апр 28, 2004 13:19:38 Dr.Golova Человек просит без особых хаков mihoshi А нельзя просто зарезервировать место в вашем PE и туда компилить код? |
|
|
Дата: Апр 28, 2004 14:00:06 S_T_A_S_ А нельзя просто зарезервировать место в вашем PE и туда компилить код? Вообще задача такая. Надо сделать интерпретатор (вроде joy), который при выполнении определяет критические участки и пытается их компилировать в код. Переписывать файл при каждом таком изменении как-то невесело. P.S. А здесь разве на "вы"? |
|
|
Дата: Апр 28, 2004 14:23:01 Dr.Golova А как это можно сделать, даже есди с хаками? Если уж NT то, что не взято из файла, за приличный код не считает... |
|
|
Дата: Апр 28, 2004 14:49:54 · Поправил: S_T_A_S_ mihoshi Про joy я не знаю :( Идея такая (упрощенно): ;;==================================================================== ======= EXE_IMAGE_BASE EQU 400000h format PE GUI 4.0 at EXE_IMAGE_BASE section 'Tai Chi'code executable data readable writeable entry ;; здесь собственно сам интерпретатор, данные и т.п. data import ..... ;; импорт ..... end data RESERVED_FOR_JIT_COMPILED_CODE: rb 2000h ;; суда компилируем в процессе работы ;;=========================================================================== imho это самый простой способ. Последние 8Кб все равно в готовый экзешник не пойдут. А при его загрузке виндос место выделит, осталось тока туда записать нужный код и вызывать его. Если я, конечно, правильно все понял :) |
|
|
Дата: Май 2, 2004 12:51:54 Спасибо. А VirtualAlloc с флагом EXECUTABLE не катит? |
|
|
Дата: Май 4, 2004 02:28:46 · Поправил: S_T_A_S_ Дык в чем проблема с этим-то? Так сразу все и писАли. Тока это будет уже JIT в win32 :). Тут уже не важно чем компилировать. А если именно в FASM - тогда можно зарезервировать пустую секцию в PE файле и туда код компилировать - пускай выделением памяти виндосный загрузчик занимается. ЗЫ (я чего-то сдуру подумал, что для скомпилированного кода надо впринципе исключить запись на диск, даже в pagefile) ЗЫЫ imho, Dr.Golova имел ввиду это. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.096 |