Как (и где) загружается нативный код после JIT-компиляции? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть приложение, написанное на .net (C #, 64-bit), у меня также есть DLL (написанная на C ++), которую я хочу загрузить во время выполнения и вызывать определенные функции из основного приложения (из DLL)).Для этого мне нужно найти собственный код этого приложения .net и объявить указатель на функцию.

Теперь, я уже прошел заголовок PE и метаданные, нашел RVA требуемой функции, однако он возвращает меня к реализации IL (bytecode) вместо собственной (которая вызывается вво время выполнения).После некоторой отладки мне удалось найти собственный код функции (ASM), отображенный в 64-битном адресном пространстве, который я могу вызвать из библиотеки DLL, но не могу понять, как я могу найти эту функцию динамически (после каждого раза, когда код IL проходит через JITC).

Есть ли способ получить информацию о том, как / где в памяти JITC загружен собственный код?Я не мог найти что-либо актуальное в заголовке PE по этому поводу.

1 Ответ

0 голосов
/ 20 сентября 2018

После небольшого исследования я обнаружил ICorDebugFunction :: GetNativeCode , который будет возвращать адрес функции JIT (если она скомпилирована).Удалось заставить его работать через трубу.

Для тех, кто пытается сделать что-то похожее на меня, вы можете посмотреть, как объекты обрабатываются в памяти (я думаю, что это может отличаться в зависимости от среды компилятора / .net), все они кажутсяиметь указатели на таблицы, содержащие адреса функций JIT'ов (членов) с их RID (который также можно найти в заголовке PE).

...