通过 C 中的库包装器自动进行函数重定向
Automated function redirection via library wrappers in C
假设我有两个库 libA.so
和 libB.so
作为一些共享 C 库。
A 提供功能 - F1, F2, F3
B 提供功能 - F2, F3, F4
我的问题:创建一个瘦包装库,libC.so
,它调用F1和F2 来自 libA.so
和 F3 和 F4 来自 libB.so
.
我知道的一种方法是在C.c中编写一个具有相同签名的函数,并在函数内部使用dlopen
来调用libA.so
或libB.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。
假设我有两个库 libA.so
和 libB.so
作为一些共享 C 库。
A 提供功能 - F1, F2, F3
B 提供功能 - F2, F3, F4
我的问题:创建一个瘦包装库,libC.so
,它调用F1和F2 来自 libA.so
和 F3 和 F4 来自 libB.so
.
我知道的一种方法是在C.c中编写一个具有相同签名的函数,并在函数内部使用dlopen
来调用libA.so
或libB.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。