2010-06-23 3 views
1

생성 된 가져 오기 라이브러리 (dll을로드 할 프로그램을 연결하는 데 사용되는 라이브러리) AFAICS는 가져온 함수에 대한 다양한 호출을 어셈블리 jmp 구문으로 구현합니다.간단한 jmp 어셈블리로 import lib를 구현하는 방법은 무엇입니까?

이것은 실제로 매우 최적의 솔루션처럼 보입니다. 두 번 째 인수를 푸시 할 필요가 없으며 호출에서 복귀하지도 않습니다.

내 자신의 가져 오기 라이브러리를 만들어 다른 기능을 추가하고 싶습니다. 이를 위해 LoadLibrary()GetProcAddress() 함수를 호출하여 dll 함수의 주소를 가져와야합니다. 그런 다음, 함수 주소를 통해 가져온 함수를 호출하는 고유 한 함수를 제공해야합니다. 그러나 이것은 두 번의 호출을 의미하며 스택의 매개 변수를 다시 푸시합니다. 이 두 번 호출을 최적화하고 싶습니다.

누군가가 C에서 구현하는 방법에 대해 알고 있습니까? jmp 트릭을 수행 할 가져 오기 라이브러리가 있습니까? (또는 컴파일러가 트레일 호출을 최적화합니까?)

+1

나는 당신이 여기서 무엇을 묻고 있는지 분명히 알지 못합니다. 먼저 수입 라이브러리가 이것을한다고 말하면, 어떻게 할 수 있는지 묻습니다. 명확히 해 주시겠습니까? – torak

답변

1

"기능 전달"이라고 생각하는 것에 관심이있을 것 같은데요. DLL을 사용하여 실제로 다른 DLL에 구현 된 DLL에서 함수를 내보낼 수 있습니다.

  1. 당신은
  2. 당신이 당신의 수출 DLL에서 가져 로더가의 주소를 저장을 LoadLibrary()/GetProcAddress를()에 대한 호출이 필요하지 않습니다 가장 효율적인 솔루션에 대한이어야한다 가져 오기 테이블의 실제 impmplementation 때문에이를 구현하기는 하나 call 및 아마 jmp

한 가장 쉬운 방법은

0과 같이 함께
#pragma comment(linker, "/export:ExportedFuncName=ActualDll.ActualFuncName") 

궁금한 점이 있으시면 링커 명령 줄에서 "/export:ExportedFuncName=ActualDll.ActualFuncName"을 전달하는 것과 사실상 같습니다. 모듈 정의 (.DEF) 파일의 내보내기 섹션을 사용하여이 작업을 수행 할 수도 있습니다. 자세한 내용은 하단 here을 참조하십시오.

+0

좋은 기술. 하지만 포워딩은 적용되지 않습니다. DLL을 만들고 싶지 않고 정적 라이브러리를 만들고 싶습니다. –

+0

@Didier Trosset : 좋습니다. 그러면 다른 것이 필요할 것입니다. 이것은 32 비트 또는 64 비트입니까? 그것은 assichy 코드를 사용하여 쉽게 사용할 수 있습니다. – torak

관련 문제