我刚开始学习 C,对知识的缺乏感到抱歉(我的 C 书很多)。
我想用已知的公共 API 扩展一个共享库 (libcustomer.so),但该库是封闭源代码。
这种情况可能吗?
- 将 libcustomer.so 重命名为 liboldcustomer.so
- 创建一个扩展的共享库 libcustomer.so(因此其他人会隐式地使用扩展版)
- 通过 -loldcustomer 将 liboldcustomer.so 链接到我的扩展 libcustomer.so 中
- 将任何未额外实现的方法直接转发到旧的 "liboldcustomer.so"
我认为这样不行(名称编译到 .so 中了,不是吗?)。但是有什么替代方案吗?
对于#4:是否有一般方法来解决此问题,还是我必须编写一个类似旧方法的命名并转发调用(如何实现?)?
由于原始的 libcustomer.so (=liboldcustomer.so) 可能会随时更改,因此所有这些都应动态工作。
由于安全原因,我们的系统没有 LD_PRELOAD(否则我会采用它 :( )。
考虑扩展验证检查和一些更好的 NPE 处理。
感谢您提前的帮助!
编辑:
我正在按照答案所示实现我的扩展,但目前有一个未处理的情况:
如何“代理”来自扩展库的结构体?
例如,我有这个:
customer.h:
struct customer;
customer.c:
struct customer {
int children:1;
int age;
struct house *house_config;
};
现在,在我的customer-extension.c文件中,我正在编写来自customer.c的所有公共方法,但是如何“传递”结构体呢?
非常感谢您的时间和帮助!