Я компилирую общий объект (.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++ без публичного отображения всех этих символов?