2010-05-07 7 views
5

런타임에 mylib.so와 연결되는 C++ 프로그램이 있습니다. 그런 다음 동일한 프로그램이 dlopen()/dlsym()을 사용하여 mylib.so에 종속 된 동적 라이브러리 인 myplugin.so에서 함수를로드합니다.은 dlopen으로로드 된 플러그인간에 공유되는 라이브러리 전역을 런타임 연결로 연결합니까?

내 질문은 : 프로그램과 플러그인의 함수가 프로그램을 위해 예약 된 동일한 메모리 영역에 mydlib.so에 정의 된 동일한 전역에 액세스 할 것인가 아니면 각자 자신의 메모리 공간에 서로 다른 관련이없는 복사본이 할당 될 것인가? ? 후자가 기본 동작 인 경우이를 변경할 수 있습니까?

미리 감사드립니다.

답변

1

dlopen을 수행하는 주 프로그램의 전역 변수가 동적으로로드되는 코드에 표시되어야합니다. 그러나 필자가 보았던 최고의 충고는 (특히 모호한 코드를 원한다면) 함수 호출을 링커 분할에 전달하고 어느 방향으로도 변수를 내 보내지 않는 것입니다. 로드 된 코드가 해당 API의 흥미로운 부분을 로더에 등록하는 API가있는 경우 (예 : "여기에 내가 SPI을 baz에 드로잉하기 위해 어떻게 제공합니까?") 매우 건강한 방법입니다. callbacks보다는 모든 것을 함께 매시.

[편집] :이를 지원하는 다른 플랫폼은 약한 링크를 지원하지 않는 플랫폼에서 시뮬레이션하는 경우입니다. 동적 라이브러리에서 내 보낸 API 중 SPI를 빌드하는 주 프로그램 인 경우를 제외하고는 목록에있는 다른 프로그램과 많이 비슷합니다. .so 시작시 API를 명시 적으로 내보내는 대신 동적 라이브러리에서 내 보냅니다. 실제로는 두 번째로 좋습니다.하지만 일종의 연결 라이브러리를 작성하여 작업을 수행 할 준비가되어 있지 않는 한, 원하는 것을 얻는 대신 오히려 원하는 작업을 수행 할 수 있습니다.

+0

깨끗한 API/SPI를 사용하는 경우 +1 – neuro