동일한 이름의 함수를 제공하는 두 개의 라이브러리가있는 경우 어떻게해야합니까?
답변
- 하나 또는 둘 다를 제어하는 경우 : 하나를 편집하여 이름을 변경하고 다시 컴파일하거나 소스 코드에 액세스 하지 않고도 작동하는 Ben 및 unknown 의 답변을 동등하게 볼 수 있습니다.
- 둘 중 하나를 제어하지 않으면 둘 중 하나를 래핑 할 수 있습니다. 그것은 다른 ( 정적으로 링크 된 !) 라이브러리를 컴파일 하는 것입니다. 이것은 다른 이름의 래퍼를 통해 도달하는 문제가되는 것을 제외하고 원본의 모든 심볼을 다시 내보내는 것 외에는 아무것도하지 않습니다. 얼마나 번거로운가.
- 나중에 추가 : qeek가 동적 라이브러리에 대해 이야기하고 있다고 말했기 때문에 Ferruccio 와 mouviciel 이 제안한 솔루션 이 아마도 가장 좋습니다. (정적 연결이 기본이었던 옛날에 살고있는 것 같습니다. 그것은 제 생각을 채색합니다.)
주석에 대한 제안 : “내보내기”란 라이브러리에 연결된 모듈을 볼 수 있도록하는 것을 의미합니다 extern
. 파일 범위 의 키워드 와 동일합니다 . 이것이 제어되는 방법은 OS 및 링커에 따라 다릅니다. 그리고 그것은 제가 항상 찾아봐야하는 것입니다.
답변
다음을 사용하여 개체 파일의 기호 이름을 바꿀 수 있습니다. objcopy --redefine-sym old=new file
(man objcopy 참조)를 .
그런 다음 새 이름을 사용하여 함수를 호출하고 새 개체 파일과 연결합니다.
답변
Windows에서는 LoadLibrary () 를 사용 하여 이러한 라이브러리 중 하나를 메모리에로드 한 다음 GetProcAddress () 를 사용 하여 함수 포인터를 통해 함수를 호출하고 호출해야하는 각 함수의 주소를 가져올 수 있습니다.
예 :
HMODULE lib = LoadLibrary("foo.dll");
void *p = GetProcAddress(lib, "bar");
// cast p to the approriate function pointer type (fp) and call it
(*fp)(arg1, arg2...);
FreeLibrary(lib);
foo.dll에서 bar라는 함수의 주소를 가져 와서 호출합니다.
나는 유닉스 시스템이 유사한 기능을 지원한다는 것을 알고 있지만 그 이름은 생각할 수 없습니다.
답변
여기에 생각이 있습니다. 16 진 편집기에서 문제가되는 라이브러리 중 하나를 열고 문제가되는 모든 문자열을 다른 것으로 변경하십시오. 그러면 이후의 모든 호출에서 새 이름을 사용할 수 있습니다.
업데이트 : 나는 방금 이것을 끝냈고 작동하는 것 같습니다. 물론 나는 이것을 철저히 테스트하지 않았습니다. hexedit 산탄 총으로 다리를 날려 버리는 좋은 방법에 지나지 않을 것입니다.
답변
Linux를 사용한다고 가정하면 먼저 추가해야합니다.
#include <dlfcn.h>
예를 들어, 적절한 컨텍스트에서 함수 포인터 변수를 선언하십시오.
int (*alternative_server_init)(int, char **, char **);
https://stackoverflow.com/a/678453/1635364에 명시된 Ferruccio와 같이 , 실행하여 사용하려는 라이브러리를 명시 적으로로드합니다 (좋아하는 플래그 선택).
void* dlhandle;
void* sym;
dlhandle = dlopen("/home/jdoe/src/libwhatnot.so.10", RTLD_NOW|RTLD_LOCAL);
나중에 호출하려는 함수의 주소를 읽으십시오.
sym = dlsym(dlhandle, "conflicting_server_init");
다음과 같이 할당 및 캐스팅
alternative_server_init = (int (*)(int, char**, char**))sym;
원본과 비슷한 방식으로 전화하십시오. 마지막으로 다음을 실행하여 언로드합니다.
dlclose(dlhandle);
답변
함께 사용하지 마십시오. 내가 올바르게 기억하면 링커는 그러한 경우 오류를 발행합니다.
나는 시도하지 못했지만, 해결책이있을 수 있습니다 dlopen()
, dlsym()
그리고 dlclose()
어떤 프로그래밍 동적 라이브러리를 처리 할 수 있습니다. 두 함수가 동시에 필요하지 않은 경우 두 번째 라이브러리 / 함수를 사용하기 전에 첫 번째 라이브러리를 열고 첫 번째 함수를 사용하고 첫 번째 라이브러리를 닫을 수 있습니다.
답변
.o 파일이있는 경우 여기에 좋은 대답이 있습니다. https://stackoverflow.com/a/6940389/4705766
요약:
objcopy --prefix-symbols=pre_string test.o
.o 파일의 기호 이름을 바꾸려면
또는
objcopy --redefine-sym old_str=new_str test.o
.o 파일에서 특정 기호의 이름을 바꿉니다.
