Как реализовать импорт lib с простой сборкой jmp? - PullRequest
1 голос
/ 23 июня 2010

Сгенерированные библиотеки импорта (те, которые используются для связывания программы, которая будет загружать dll) AFAICS реализует различные вызовы импортированных функций как сборку jmp statments.

Это действительно выглядит как очень оптимальное решение,Он не требует повторного нажатия аргументов и возврата из вызова.

Я хочу создать свою собственную библиотеку импорта, чтобы добавить в нее пару других функций.Для этого мне нужно вызвать функции LoadLibrary() и GetProcAddress(), чтобы получить адреса функций в dll.Но затем я должен предложить свои собственные функции, которые будут вызывать импортированные через адрес функции.Но это подразумевает два вызова и повторную загрузку параметров в стеке.Мне бы хотелось, чтобы этот двойной вызов был оптимизирован.

Кто-нибудь знает о способе реализации в C библиотеки импорта, которая сделала бы такой же трюк jmp?(Или компилятор оптимизирует вызов trail?)

1 Ответ

1 голос
/ 23 июня 2010

Звучит так, как будто вас может заинтересовать то, что, как я считаю, называется «перенаправление функций».Это позволяет вам экспортировать функцию из библиотеки DLL, которая в действительности реализована в другой библиотеке DLL.

Должно быть самое эффективное решение

  1. Вам не понадобятся вызовы LoadLibrary () / GetProcAddress ()
  2. При импорте из вашей экспортной DLL, загрузчик хранит адрес реального воплощения в таблице импорта, поэтому его один call и один jmp

Вероятно, самый простой способ реализовать это с чем-то вроде

#pragma comment(linker, "/export:ExportedFuncName=ActualDll.ActualFuncName")

В случае, если вам интересно, это практически то же самое, что передать "/export:ExportedFuncName=ActualDll.ActualFuncName" в командной строке компоновщика.Это также возможно сделать с помощью секции экспорта файла определения модуля (.DEF).Подробности смотрите в нижней части здесь .

...