ld -shared -Bsymbolic will reduce number of dynamic relocations in a shared library. Unfortunately, it won't work correctly with C++ exception and maybe other language features.
However, I think it is possible to make -shared -Bsymbolic to work for C++ by providing a way to specify a list of symbols which must be dynamic. We then can do # g++ -Wl,-Bsymbolic -shared -xxx "list of dynamic symbols" -o libfoo.so ... and libfoo.so written in C++ will work correctly with much fewer dynamic relocations. H.J.