2012-03-21 3 views
0

내 응용 프로그램의 한 특정 모듈이 이전 버전의 libc를 사용하도록하려면 어떻게합니까?두 버전의 libc를 동일한 응용 프로그램에 연결하는 방법은 무엇입니까?

내 응용 프로그램에 링크해야하는 두 개의 .so 파일이 있지만 그 중 하나는 이전 버전의 libc에서만 작동하고 다른 하나는 최신 버전에서만 작동합니다.

나는 소스를 가지고 있지만 오류의 원인을 추적하는 것은 실패했다. 나는 확실히 그 정확한 픽스이기 때문에, 그 수색을 멈추지 않을 것이다.

어쨌든 응용 프로그램의 일부분 만 링커가 이전 libc를 사용하게 할 수 있습니까?

정적으로 링크하고 있거나 심볼릭 링크를 설정해도 괜찮습니다.

업데이트/명확한 설명 :

나는이 코드베이스에 변경없이 일어날 수 있도록 노력하고있어. 이 매우 구체적인 .so 파일의 경우 libc 심볼은 libc의 이전 복사본을 가리 키도록 만들어야한다는 링커에게 알리는 방법을 찾고 싶습니다.

실제 버그를 찾았을 때도 이것은 흥미 롭기에 충분히 도전적인 것 같습니다.

이것도 가능합니까?

감사

답변

1

기술적으로, 당신은 동적으로 다음 dlsym을로에서 문자의 주소를 검색 dlopen을 가진 다른 라이브러리를로드 할 수 있습니다. 이렇게하면 함수의 주소를 가져오고 기본 코드 대신 해당 코드를 호출 할 수 있습니다. 예를 들어 linker documentation page을 참조하십시오.

그러나 이것은 영향을받는 코드의 크기와 최악의 경우, 표준 C 라이브러리의 낮은 수준과 그것이 암시 할 수있는 충돌/불일치를 감안할 때 구현하기에 적어도 복잡 할 것입니다.

코드 (또는 libc의) 뭐가 잘못 이해하는 것은 확실히

이 업데이트 더 나은 방법이 될 것입니다 :

지금까지 내가 아는 한 기호 하나의 이름 공간이, 아니이에게 코드 기원에 따라 심볼을 어떻게 처리할지 알려주는 방법. 내가 제안한 접근 방식으로 코드를 수정해야합니다.

또는 각각의 libc와 연결된 두 개의 프로그램으로 코드를 분할하고 소켓, 공유 메모리 또는 다른 어떤 방법으로도 통신 할 수 있지만 코드를 다시 작성하고 여기에서 다시 구조화하는 것을 의미 할 수 있습니다.

+0

재미있는 링크, 감사합니다. 분명히 버그를 찾을 수있는 올바른 해결책이지만, 그것은 문제의 핵심은 아닙니다. :) 컴파일러 플래그 수준에서 수행 할 수 있습니까? 원래 게시물을 업데이트하겠습니다. – nonot1