How to remove symbols directly from a dynamic library binary(.so)?

30 Views Asked by At

I have a dynamic 3rd party library that has bunch of symbols from libc++ exposed. When I put everything together I have an ODR violation, half of my std::basic_string is from one lib, one is from another. I don't have the lib's source code, so I can't just recompile it with different settings. Is it possible to somehow hide or strip symbols I don't use in my project directly from the *.so file?

$ find . -name "*.so" -type f -exec llvm-nm.exe --print-file-name --demangle --dynamic --defined-only {} \; | egrep '.*? .*? . std::__ndk1::basic_string<char' | sed 's/::__ndk1//g' | grep '>::basic_string' | sed 's/<char, std::char_traits<char>, std::allocator<char> >//g'

./libc++_shared.so: 00000000000cb334 W std::basic_string::basic_string(std::basic_string const&)
./libc++_shared.so: 00000000000cb434 W std::basic_string::basic_string(std::basic_string const&, std::allocator<char> const&)
./libc++_shared.so: 00000000000cc024 W std::basic_string::basic_string(std::basic_string const&, unsigned long, unsigned long, std::allocator<char> const&)
./libc++_shared.so: 00000000000cb334 W std::basic_string::basic_string(std::basic_string const&)
./libc++_shared.so: 00000000000cb434 W std::basic_string::basic_string(std::basic_string const&, std::allocator<char> const&)
./libc++_shared.so: 00000000000cc024 W std::basic_string::basic_string(std::basic_string const&, unsigned long, unsigned long, std::allocator<char> const&)
./libc++_shared.so: 000000000007ca0c W std::basic_string::basic_string<std::nullptr_t>(char const*)
./libvivox-sdk.so: 0000000000510f98 W std::basic_string::basic_string(std::basic_string const&)
./libvivox-sdk.so: 00000000005110cc W std::basic_string::basic_string(std::basic_string const&, std::allocator<char> const&)
./libvivox-sdk.so: 0000000000511178 W std::basic_string::basic_string(std::basic_string const&, unsigned long, unsigned long, std::allocator<char> const&)
./libvivox-sdk.so: 0000000000510f98 W std::basic_string::basic_string(std::basic_string const&)
./libvivox-sdk.so: 00000000005110cc W std::basic_string::basic_string(std::basic_string const&, std::allocator<char> const&)
./libvivox-sdk.so: 00000000004e0ac4 W std::basic_string::basic_string<std::nullptr_t>(char const*)
0

There are 0 best solutions below