Let say I have libA.so and libB.so, is there any way for me to combine them into a single shared library libC.so that contains all exported symbols of both libA.so and libB.so?
Quite frankly this is rather a development (i.e. StackOverflow) question than RCE, but let me give the level of advice I can give with the level of information you provided in your question.
The question is whether what you want to achieve is to have those symbols available through a single library by all means or whether you don't care how both sets of symbols are made available to your program(s).
If you insist on the library, you could simply write one shared library and export the symbols from it through shallow wrapper functions, but use the dynamic loader to find them from the originating shared objects (check out
ldd and related man pages). It is not too difficult to find all symbol names with
readelf --dyn-syms <elf-file>/
readelf --syms --use-dynamic <elf-file> (the package on Ubuntu/Debian is
elfutils). From the output of that you can write a version script to use in your linker (e.g.
gcc -Wl,--version-script,script.map ...).
However, assuming you use the default Linux facilities with no additional magic involved, you can also abuse the
ld.so approach of locating the symbols. If you write a simple wrapper shell script that sets
LD_PRELOAD, you can simply load both shared objects up front and they should - under normal circumstances - take precedence over other symbols. It's also commonly used as a debugging technique.
I strongly suggest you read chapters 41 and 42 of Michael Kerrisks excellent book "The Definitive Guide to Linux and Unix System Programming", colloquially known as TLPI. The respective source samples may come in handy, too, in your case.