Как динамическое связывание работает с исполняемыми файлами CLR? - PullRequest
1 голос
/ 27 мая 2019

Это теоретический вопрос, который я задаю, потому что я знаю, как динамическое связывание работает с обычным .exe. Вы связываете объектный файл и .lib, и он заменяет вызовы функций переходами в таблицу импорта, а затем во время выполнения динамический компоновщик находит модуль в текущем каталоге или system32 и заполняет таблицу импорта адресами из таблицы экспорта таблицы. длл. Это примерно так.

Но с .NET он компилируется в .exe, который, я думаю, содержит данные заголовка CLR / CLR в начале раздела .text, а данные CLR содержат код CIL. Остальная часть раздела .text, где я предполагаю, что точка входа связана с MSCorEE.dll, которая, вероятно, передает указатель на заголовок / данные CLR одной из функций MSCorEE.dll.

Мои вопросы: как CIL-код исходной программы динамически связывается с модулями, которые она собирается использовать, скажем, .NET-программа вызывает функции в kernel32.dll. Если CIL компилируется JIT на лету, как эти вызовы функций в CIL разрешаются по адресам в kernel32.dll, который загружается в адресное пространство программы? Существует ли отдельный динамический компоновщик, который может вставлять адреса табличных функций импорта в код CIL до его компиляции, например, в. x86

...