如何围绕linux中的c/c++共享库创建我的瘦包装器共享库



问题语句。有两个共享库,libA.so和libB.so,都公开了同一组函数。现在,我有很多小程序(比如100个(需要链接到libA.so或libB.so

选项1。构建两组这样的程序,一组链接到libA.so,另一组连接到libB.so。

选项2.创建一个瘦包装共享库libMy.so并链接为:

gcc -shared -o libMy.so libA.so
gcc -o main1 -L. -lMy main1.o

其思想是,通过设置LD_LIBRARY_PATH,可以在不同版本的libMy.so(基于libA.so或libB.so(中交换,从而使用相同构建的main1、main2。

问题是,在链接时,main1、main2。。。如命令readelf -D main1所示,仍然引用libMySo之外的libA.so。

问题是,什么样的链接器选项使main1只直接依赖于libMySo,而libMySo直接依赖于libA.so或libB.so,以实现可交换的提供程序。

真正的例子是,libA.so和libB.so是两个odbc驱动程序,一个用于oracle,另一个用于postgresql。如何以独立于数据库的方式链接可执行文件?

您确实需要制作一个瘦包装器库,该库提供与libA.so/libB.so相同的接口。该库将通过dlopen在内部加载实际实现,通过dlsym定位其中方法的实现,并在运行时向它们分派调用。您的应用程序将需要针对libwrapper.so仅链接,并且不知道实际的实现。

这样的包装器库可以手动编写,也可以通过Implib.so包装器生成器编写

$ implib-gen.py --dlopen-callback=mycallback libxyz.so

macallback回调将决定加载哪个库:

$ cat mycallback.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C"
#endif
void *mycallback(const char *lib_name) {
lib_name = lib_name;  // Please the compiler
void *h = dlopen(some_condition ? "libA.so" : "libB.so",
RTLD_LAZY);
if (h)
return h;
fprintf(stderr, "dlopen failed: %sn", dlerror());
exit(1);
}

最新更新