2012-12-13 3 views
1

실행 가능한 이진 파일에 링크 된 정적 라이브러리 (my_static_lib)가 있습니다. 내 기호 중 일부는 내 바이너리에서 사용되지만 전부는 아닙니다.특정 기호를 이진 파일로 유지하는 방법은 무엇입니까?

동적으로로드 된 두 번째 라이브러리 (my_shared_lib)는 이진의 심볼 주입을 통해 my_static_lib에서 일부 심볼을 ​​수신하려고합니다. 그러나 이러한 기호는 my_binary에서 사용되지 않으므로 최종 bin 파일에서 제거됩니다.

따라서 런타임에 my_shared_lib__my_stripped_symbols__을 찾을 수 없다는 메시지와 함께 충돌합니다.

링커가 계속 __my_stripped_symbols__을 유지하도록 할 방법이 있습니까? 나는/나는 그것이 실행의 다소 복잡한 그룹의 다른 부분에 이상한 충돌을 생성하기 때문에 my_shared_libmy_static_lib를 연결하지 않으려는 깨끗하게 Makefile.am (autotools를) 작성할 수 있습니다 뭔가

(-binary file makefile) 
-L$(top_builddir)/static_lib -lmy_static_lib --magic-flag-to-keep-stripped-symbol 

를 선호 공유 라이브러리.

답변

4

my_static_lib을 응용 프로그램에 연결할 때 --whole-archive 옵션을 사용하려고합니다. ld options docs에 설명되어 있습니다. 반드시 전체 라이브러리를 유지하게됩니다

-L$(top_builddir)/static_lib -Wl,-whole-archive -lmy_static_lib -Wl,-no-whole-archive 

하고 실행 사용뿐 아니라 특정 기능 :

당신이 GCC와 연결하는 경우, 그것은 다음과 같이 보입니다.

또한 기호를 내 보내야합니다. 정적 라이브러리의 심볼을 이미 내 보내지 않은 경우 -fvisibility=hidden을 조합하고 __attribute__ ((visibility("default")))을 사용하여 내보내려는 심볼을 표시하십시오. 당신은 그것에 대해 조금 더 읽을 수 있습니다. gcc docs

관련 문제