2013-03-11 2 views
2

포인트 : ws2_32.lib에 링크 된 타사 정적 라이브러리에 링크되는 일부 C++ 코드가 있습니다.dll을 정적 라이브러리로 바꾸기

목표 : 나는 어떤 DLL을 허용하고 독점적 인 UDP 프로토콜의 구현이되지 않습니다 제외하고 기본적으로 Win32 플랫폼 인 임베디드 플랫폼에 포트에 방법이 C++ 코드를 조사하고 .

전략 : 내가 정적 라이브러리를 쓰고 싶습니다 모방 윈속 API (또는 내가 걱정이 API의 최소 부분 집합). 이러한 관련 winsock 함수는 임베디드 플랫폼에서 지원하는 독점 UDP 함수 호출에 대한 래퍼 역할을합니다.

가정 : 이 정적 라이브러리를 ws2_32.lib 대신 최종 실행 파일에 연결할 수 있습니다.

질문 :

  1. 내 가정이 올바른/합리적인가요?
  2. 어떻게 링크를 기계적으로 설정합니까? 내가 무슨 짓을

은 : 그래서에 하나 개의 기능을 수행하는 시도, 및 연결 수없는 것. 이것은 내가 내 정적 라이브러리에서 정의한 것입니다 : 내가 연결하면

unsigned short __stdcall htons(unsigned short hostshort) { 
    return hostshort; 
} 

, 나는 다음과 같은 오류가 발생합니다 :

: error LNK2001: unresolved external symbol [email protected] 

링크 메시지에서이 __imp__ 접두사 내가 확실히 이해하지 못하는 무언가이다. dll에 정의 된 함수의 이름이 특별한 방법으로 바뀌었고 정적 라이브러리에서이를 위조하여 어떻게 든 링커가 ws2_32.lib에있는 함수 대신 내 버전의 함수에 연결하도록 할 수 있습니까?

도움을 주시면 감사하겠습니다.

답변

1

Winsock을 독점 네트워크 스택으로 대체하는 경로를 따르고 싶지는 않습니다.

그러나 당신이해야 할 일은 htons과 같은 간단한 루틴을 모방하는 것입니다.

루틴을 extern "C"으로 표시해야하며 해당 루틴을 내보낼 때 표시해야 할 수도 있습니다.당신은 C 호환 externs로 표시하지 않는 경우

extern "C" 
{ 
__declspec(dllexport) 
unsigned short __stdcall htons(unsigned short a) { return a; } 
} 

링커는 일부 name mangling 않습니다.

+0

실은 나는 extern "C"'에 대해 생각하지 않는다는 사실에 매우 당혹 스럽다. 위의 벤이 게시물과 함께 완벽하게 트릭을 했나요? 파일 이름을'FakeWS2_32.cpp'에서'FakeWS2_32.c'로 변경하고'unsigned short __stdcall _imp__htons (unsigned short a) {return a; }'. 링크가 성공했습니다. 이러한 메커니즘을 제쳐두고 내 상황에서 약 20 개의 winsock 기능을 다시 구현하는 대신에 무엇을 권하고 싶습니까? –

+0

대안이 없습니다. 나는 Zach가 Windows에 포함 된 네트워크 스택을 교체하지 말 것을 권장하고 있습니다 ... 귀하의 플랫폼에는 Windows 네트워크 스택조차 없기 때문에 적용되지 않습니다 (거기에없는 것을 대체 할 수는 없습니다). –

+0

좋은 지적. 내 의자에서 나는 대안을 찾지 못한다. 난 단지 다시 구현해야 할 winsock API 호출의 작은 하위 집합을 찾을 수 있기를 희망하고 있으며 독점 ​​API를 사용하여이를 수행 할 수 있기를 바랍니다. 도움을 주신 모든 분들께 감사드립니다. 정말 잘 작동합니다. –

0

접두어 __imp__은 DLL 함수에 대한 트램 폴린 (꼬리 호출)임을 나타냅니다. 라이브러리로드 및 수정 중에 라이브러리 함수의 실제 주소를 변경해야하는 곳이 하나 밖에 없기 때문에 동적 연결을 효율적으로 수행 할 수 있습니다. 컴파일러는 헤더 파일이 함수 선언에 __declspec(dllimport)을 사용했기 때문에이를 찾습니다.

dllimportwinsock2.h에서 제거하거나 _imp__ 접두어로 구현을 정의 할 수 있습니다.

+0

내 함수 정의에서'_imp__' 접두어를 사용하는 것이 가장 먼저 생각한 일이었습니다. 도와주지 않았어. 제 3 자 라이브러리가 winsock 헤더 파일에서'__declspec (dllimport)'와 함께 컴파일 되었다면, 지금 그것을 변경하는 것은 나를 위해 아무것도하지 않을 것입니다. 제 3 자 라이브러리는 링크 오류가 발생한 곳이며 소스 코드가 없어서 다시 컴파일 할 수 없습니다. 다른 생각? –

+0

고마워, 벤. 아래를 참조하십시오. 그것은 당신의 제안과 트릭을 한 C 스타일 연동의 조합이었습니다. –

관련 문제