2010-06-23 3 views
1

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

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

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

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

+1

Я не совсем понимаю, о чем вы здесь спрашиваете. Сначала вы говорите, что библиотеки импорта делают это, тогда вы спрашиваете, как заставить их это делать. Не могли бы вы уточнить? – torak

ответ

1

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

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

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

Наверное, самый простой способ осуществить это с чем-то вроде

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

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

+0

Хорошая техника. Но пересылка не применяется: я не хочу создавать DLL, я хочу создать статическую библиотеку. –

+0

@Didier Trosset: Хорошо, так что потребуется что-то еще. Это 32-разрядная или 64-разрядная версия? Это влияет на легкость, с помощью которой можно использовать код сборки. – torak