通过 C 中的库包装器自动进行函数重定向

Automated function redirection via library wrappers in C

假设我有两个库 libA.solibB.so 作为一些共享 C 库。

A 提供功能 - F1, F2, F3
B 提供功能 - F2, F3, F4

我的问题:创建一个瘦包装库,libC.so,它调用F1F2 来自 libA.soF3F4 来自 libB.so.

我知道的一种方法是在C.c中编写一个具有相同签名的函数,并在函数内部使用dlopen来调用libA.solibB.so,分别。

但这个问题感觉应该是可以解决的,无需编写任何额外的代码,只需使用链接器工具将函数重定向到适当的库即可。

是否真的可以使用任何自动化工具创建这样的库libC.so

这似乎是一个足够简单的问题,其他人在我之前一定已经想到了,但我无法看到如何自动创建这样的库,也无法为自动包装器创建者找到任何好的资源。

你是对的,这样的包装可以很容易地自动生成。一个现有的解决方案是 Implib.so 工具。在您的情况下,您可以使用它为 libA 和 libB 生成具有有限接口的包装器:

$ cat libA_syms.txt
f1
f2
$ implib-gen.py --symbol-list libA_syms.txt libA.so
Generating libA.so.tramp.S...
Generating libA.so.init.c...
$ cat libB_syms.txt
f3
f4
$ implib-gen.py --symbol-list libB_syms.txt libB.so
Generating libB.so.tramp.S...
Generating libB.so.init.c...

然后使用生成的代码创建包装器库:

$ gcc -shared -fPIC -fvisibility=hidden libA.so.* libB.so.* -o libC.so

有关完整示例,请参阅 this file