【发布时间】:2013-01-21 23:01:07
【问题描述】:
我是 C 的新手,很抱歉我缺乏知识(我的 C 书真的很庞大 :)
我想用封闭源代码扩展一个共享库 (libcustomer.so),但公开的 api。
这样的事情可能吗?
- 将 libcustomer.so 重命名为 liboldcustomer.so
- 创建一个扩展的共享库 libcustomer.so(因此其他人隐式使用扩展的)
- 通过 -loldcustomer 将 liboldcustomer.so 链接到我的扩展 libcustomer.so
- 将任何未额外实现的方法直接转发到旧的“liboldcustomer.so”
我不认为它会那样工作(名称被编译到 .so 中,不是吗?)。 但是有什么选择呢?
对于#4:有没有一种通用的方法可以做到这一点,还是我必须编写一个像旧方法一样命名的方法并转发调用(如何?)?
因为原始的 libcustomer.so (=liboldcustomer.so) 会不时更改,所以所有这些东西都应该动态工作。
出于安全原因,我们的系统没有 LD_PRELOAD(否则我会采用 :( )。
考虑扩展验证检查和一些更好的 NPE 处理。
提前感谢您的帮助!
编辑:
我只是在实现我的扩展,如答案所示,但我目前有一个未处理的案例:
如何“代理”扩展库中的结构?
例如我有这个:
客户.h:
struct customer;
客户.c:
struct customer {
int children:1;
int age;
struct house *house_config;
};
现在,在我的 customer-extension.c 中,我正在编写来自 customer.c 的所有公共方法,但我如何“传递”这些结构?
非常感谢您的时间和帮助!
【问题讨论】:
-
您的第一个附加问题的答案已经给出。第二个密切相关 - C/C++ 不包含任何二进制元信息,如 Java/.NET,因此您无法猜测“客户”结构的定义可能是什么样子。即使您记住此结构中字段的类型和名称,编译器设置也可能存在问题 - 例如,字段对齐。
标签: c shared-libraries extending