2013-07-30 3 views
2

다른 응용 프로그램에 LD_PRELOAD이있는 공유 객체 (.so)를 컴파일 중입니다. libstdC++와 libgcc를 정적으로 연결하고있다. -static-libgcc -static-libstdc++을 사용하면 shard 객체 충돌을 피할 수있다. 이렇게하면 libstdC++의 모든 내용이 공개 기호로 공개됩니다. 내가 Linux g ++ : 내 보내지 않고 정적 libstdC++에 연결

nm -D mylib.so 

을 수행 할 때이이 때문에 C++ 응용 프로그램에 LD_PRELOADed 될 때부터 내가

00000000000714e0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv 
0000000000071530 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv 
00000000000714d0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv 
00000000000714f0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv 
0000000000071540 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv 
0000000000071520 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv 
00000000000712a0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv 

이것은 나쁜 같은 물건을 많이 얻을,이 기호는 원인이되는 응용 프로그램 기호를 무시하려고 예기치 않은 행동.

그렇다면 이러한 기호를 모두 공개하지 않고 libstdC++에 정적으로 gcc 링크를 만들려면 어떻게해야합니까?

답변

0

visibility pragmasvisibility function attributes을 사용할 수 있습니다.

hidden 또는 protected 시정 가능성이 있습니다.

libstdc++에 정적으로 링크 할 수 있는지 잘 모르겠으므로 그 결과로 mylib.soposition independent code이 포함될 수 있습니다. this answer을 읽어 보면 왜 나쁜 생각 일 수 있는지 설명하고 다른 유용한 참고 자료를 제공합니다.

관련 문제