dynamic link시 so 파일 내부에서 사용되는 동일 함수명들은 어떻게 처리될까요?

익명 사용자의 이미지

gnu c에서요;;

a1.so 에는 아래와 같은 함수들이 무수히 많고 a2.so에 있는 foo()를 호출하려 합니다.
begin(){ foo(); }

a2.so
foo(){}

b1.so 에도 마찬가지로 동일한 함수명이 있고 b2.so에 있는 foo()를 호출하려 합니다.
begin() { foo();}

b2.so
foo() {}

하나의 실행파일에서 위 4개의 so를 모두 dlopen하여
dlsym()을 통해 각각의 so 내에 있는 begin()은 구분할 수 있습니다.

그런데 begin() 내에서 호출하는 foo()는 따로 바꿀수 없는 상황이라면
어떻게 동작할까요???

a1.so의 begin() 이 b2.so의 foo()를 호출하지 못하도록 막고 a2.so의 foo()를 정확히 잘 찾아서 호출할 수 있도록 하려면
어떻게 하나요???

wariua의 이미지

참 고민되는 상황일 거 같습니다. 그래서 고민상담실에 쓰신 거겠죠?;-)

a1.so, b1.so를 다시 컴파일 할 수 있는 상황이라면, -l 링크 옵션으로 a2, b2에 대한 의존성을 명시해서 다시 라이브러리를 만들어주시면 됩니다. dlopen()으로 라이브러리를 호출하는 코드에서는 a2와 b2는 dlopen() 할 필요가 없고, a1과 a2를 dlopen() 할 때 (적어도 첫 번째에서는) RTLD_GLOBAL 플래그를 주지 않아야 합니다.

a1.so와 b1.so를 다시 컴파일 할 수 없는 상황이라면 얘기가 좀 복잡해집니다. a1.so과 b1.so 파일에 a2와 b2에 대한 의존성 정보를 추가할 수 있으면 될 텐데 저는 방법을 모르겠고...

몇 가지 조건만 맞는다면 dlopen()을 호출하는 쪽에서 foo()에 대한 wapper 함수를 만들어서 좀 지저분하게라도 가능은 할 것 같습니다.

$PWD `date`