Динамическое разрешение функций C stdlib из.NET

Я хочу разрешить адреса функций, таких как те из C stdlib, таких как malloc во время выполнения из кода.NET (поэтому я могу JIT машинный код, который вызывает эти адреса для моей виртуальной машины). Я считаю, что я должен использовать LoadLibrary а также GetProcAddress поставляя kernel32.dll, но это не работает. Используя интерактивный F# я получаю:

> [<DllImport("kernel32.dll", CharSet=CharSet.Ansi, SetLastError=true)>]
  extern IntPtr LoadLibrary(string fileName);;
val LoadLibrary : string -> IntPtr

> [<DllImport("kernel32.dll", CharSet=CharSet.Ansi, SetLastError=true)>]
  extern uint32 GetProcAddress(IntPtr hModule, string fn);;
val GetProcAddress : IntPtr * string -> uint32

> let kernel32 = LoadLibrary @"kernel32.dll";;
val kernel32 : IntPtr = 1993146368n

> let malloc = GetProcAddress(kernel32, "malloc");;
val malloc : uint32 = 0u

Таким образом, это, кажется, получил дескриптор к DLL, но пытается решить malloc вернул нулевой указатель.

Как мне это сделать?

3 ответа

Я не верю malloc это часть kernel32.dll, Однако, если я правильно помню, все malloc реализации в конечном итоге развернуть до HeapAlloc, который доступен в kernel32.dll,

Насколько мне известно mallocНЕ является частью kernel32.dll, Это часть библиотек времени выполнения MS C - поскольку вы не предоставляете никаких подробностей о том, как / где вы хотите использовать это, просто некоторые ссылки с соответствующей информацией:

В основном вы должны загрузить соответствующую DLL и затем разрешить нужную функцию, например:

let SomeMSCRT = LoadLibrary @"SomeMSCRT.dll";;
let malloc = GetProcAddress(SomeMSCRT, "malloc");;

Одно замечание:

В зависимости от того, что именно вы хотите сделать, вы можете столкнуться с серьезными и сложными проблемами отладки - например, используя malloc из F# это ИМХО плохая идея... вы должны иметь в виду, что среда выполнения C нуждается в правильной инициализации (в случае MS CRT вам нужно вызвать CRT_INIT как самое первое) и т. д. Среда выполнения C НЕ знает о каких-либо особенностях.NET и, следовательно, может привести к нестабильному поведению... esp. поскольку CLR может использовать CRT (возможно, другую версию) внутри...

Еще один момент:

Генерация машинного кода во время выполнения и выполнение его путем перехода в эту область памяти зависит от нескольких мер безопасности (в зависимости от версии Windows и т. Д.). Возможно, вам придется пометить соответствующий сегмент памяти как "исполняемый", что невозможно через среду выполнения C, это возможно только с помощью вызовов Windows API (например, VirtualAllocEx) с соответствующими разрешениями... см. отправную точку здесь и здесь.

Я хочу разрешить адреса функций, подобных тем, что есть в C stdlib

Там твоя проблема. Вы говорите так, как будто есть одна библиотека времени выполнения Си. На самом деле их много. Каждый компилятор предоставляет свой собственный, в нескольких вариантах (отладка, выпуск, статическая ссылка, динамическая ссылка), и все они взаимно несовместимы.

Если бы вы знали, какой из них вы пытаетесь использовать, ответ на ваш вопрос станет очевидным.

Если вы хотите, чтобы предоставляемые ОС библиотеки использовались всеми приложениями Windows, то kernel32.dll это правильное место, но функции соответствуют спецификации Win32 API, а не стандарту ANSI или ISO C.

Другие вопросы по тегам