[c] 두 라이브러리가 충돌을 일으키는 동일한 이름의 함수를 제공하면 어떻게해야합니까?

동일한 이름의 함수를 제공하는 두 개의 라이브러리가있는 경우 어떻게해야합니까?



답변

  • 하나 또는 둘 다를 제어하는 ​​경우 : 하나를 편집하여 이름을 변경하고 다시 컴파일하거나 소스 코드에 액세스 하지 않고도 작동하는 Benunknown 의 답변을 동등하게 볼 있습니다.
  • 둘 중 하나를 제어하지 않으면 둘 중 하나를 래핑 할 수 있습니다. 그것은 다른 ( 정적으로 링크 된 !) 라이브러리를 컴파일 하는 것입니다. 이것은 다른 이름의 래퍼를 통해 도달하는 문제가되는 것을 제외하고 원본의 모든 심볼을 다시 내보내는 것 외에는 아무것도하지 않습니다. 얼마나 번거로운가.
  • 나중에 추가 : qeek가 동적 라이브러리에 대해 이야기하고 있다고 말했기 때문에 Ferrucciomouviciel 이 제안한 솔루션 이 아마도 가장 좋습니다. (정적 연결이 기본이었던 옛날에 살고있는 것 같습니다. 그것은 제 생각을 채색합니다.)

주석에 대한 제안 : “내보내기”란 라이브러리에 연결된 모듈을 볼 수 있도록하는 것을 의미합니다 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

요약:

  1. objcopy --prefix-symbols=pre_string test.o .o 파일의 기호 이름을 바꾸려면

또는

  1. objcopy --redefine-sym old_str=new_str test.o .o 파일에서 특정 기호의 이름을 바꿉니다.