2017-01-12 4 views
1

심볼을 dlsym에만 표시하고 정적 및 동적 링크 중에 숨길 수 있습니까?정적 및 동적 연결 중 심볼 숨기기, 동적로드를 위해 dlsym에 노출

내가하고 싶은 것은 수정없이 공유 라이브러리 또는 플러그인으로 사용할 수있는 오브젝트 파일을 허용하는 것입니다. 오브젝트 파일을 라이브러리로 사용할 수 있으면 심볼 충돌을 피할 필요가 있습니다. 불행히도 이것은 플러그인으로 사용할 때 dlsym이 플러그인을 초기화하는 데 사용할 함수의 이름이 각 플러그인마다 다야한다는 것을 의미합니다. CPython은 심볼 이름 dlsym을 공유 객체의 파일 이름과 연관시킴으로써이를 해결합니다. 이것은 좋은 해결책이지만 공유 객체의 이름이 바뀌면 중단됩니다.

대신 공통 초기화 함수 이름을 dlsym으로 노출하는 대신, 공유 객체가 동적으로 링크되는 경우이 이름을 무시하도록 플러그인을 선호합니다. (이 경우 초기화는 다른 방법으로 수행됩니다.)

편집 : 질문의 전제에 대해 오해했습니다. 동일한 기호를 내보내는 동적 라이브러리 A와 B를 사용하면 프로그램이 둘 다 링크하면 링커 오류가 발생하지 않습니다.

+0

나는 그것이 가능하다고 생각하지 않는다. 유일한 해결책은 두 개의 라이브러리를 만드는 것이다. http://stackoverflow.com/questions/2222162/how-to-apply-gcc-fvisibility-option-to-symbols-in-static-libraries. – Stargateur

+0

가장 간단한 해결책은 라이브러리에 링크하지 않는 것입니다. – tofro

+0

@tofro 응? 질문은 문자 그대로이 라이브러리들이 어떻게 연결될 수 있는지를 묻습니다. – Praxeolitic

답변

3

아니요, dlsym 및 동적 링커는 구현을 공유하므로 기호를 숨기지 않고 기호를 숨길 수 없습니다.

대신 특정 경우에 할 수있는 일은 모든 플러그인에 대해 기능 이름 (또는 더 좋게는 내 보낸 문자열 리터럴)을 사용하는 것입니다. 그런 다음 번을 모두 공유 라이브러리에로드하고 dlsym(handle, common_name)을 통해이 함수를 쿼리 할 수 ​​있습니다.