2013-07-30 2 views
2

Я компилирую общий объект (.so), который должен быть LD_PRELOAD ed в другое приложение. Я связываюсь с libstdC++ и libgcc статически, используя -static-libgcc -static-libstdc++, чтобы избежать конфликтов объектов объектов shard. Выполнение этого, тем не менее, делает так, чтобы все отображалось в libstdC++ как общедоступные символы. Когда яLinux g ++: ссылка на статический libstdC++ без его экспорта

nm -D mylib.so 

Я получаю много вещей, как

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 

Это плохо, так как, когда это так будет LD_PRELOADed в C Применение ++ эти символы собираются отменить символы приложения, в результате чего неожиданное поведение.

Как я могу сделать gcc ссылку статически на libstdC++ без публичного отображения всех этих символов?

ответ

0

Вы можете использовать visibility pragmas и visibility function attributes.

Возможно, вы захотите дать hidden или protected видимость.

Я не уверен, что вы правы, чтобы статически связать libstdc++: тогда ваш итоговый mylib.so может содержать не position independent code. Читайте также this answer, который объясняет, почему это может быть плохая идея, и дает другие полезные ссылки.