如何修改shared library中的某个变量值?

2013-06-28 12:34:04 +08:00
 chaker
比如这样一个例子:
int count(){
int num = 9;
int result = 0;
for ( int i = 0; i < num; i++ ){
result ++;
}
return result;
}
封装成lib.so文件。

希望在动态加载的时候
void *handler = dlopen("lib.so", RTLD_LAZY);
能修改num的值,每次调用都循环不同的次数。

如何在lib和主程序里设计接口?不能定义成 int count( int num ) 的形式。
如果更复杂点,每次需要修改的参数类型和个数都是变化的又该怎么办?
不能include lib的header文件。

谢谢。
3009 次点击
所在节点    程序员
13 条回复
nybux
2013-06-28 13:30:25 +08:00
配置文件?
chaker
2013-06-28 13:42:31 +08:00
@nybux 是一种方法,但是太麻烦了,如果so能直接从主程序里读取数据最好了
chaker
2013-06-28 16:23:58 +08:00
或者动态库里怎么使用主函数里的变量?
nybux
2013-06-28 16:57:23 +08:00
编译时加上-fPIC就可以了
nybux
2013-06-28 16:59:37 +08:00
-> % cat b.c
#include <stdio.h>
int i = 19;
int main() {
foo();
}
-> % cat a.c
#include <stdio.h>
extern int i;
int foo() {
printf("%d\n", i);
}
-> % gcc -shared -fPIC a.c -o a.so
-> % gcc b.c a.so
-> % LD_LIBRARY_PATH=. ./a.out
19
jiych
2013-06-28 17:05:03 +08:00
gdb算吗?
chaker
2013-06-28 17:11:55 +08:00
@nybux 但是这样就不是动态加载了啊,需要把so文件加到主函数里了
chaker
2013-06-28 17:12:54 +08:00
@jiych 这个。。。当然不能算。。。总不能让用户用gdb运行他的程序吧。。。
chaker
2013-06-28 17:17:35 +08:00
@nybux 或者可以通过传递一个类实现吗
nybux
2013-06-28 17:51:08 +08:00
这样还是动态加载的,如果a.so不存在的话
-> % ./a.out
./a.out: error while loading shared libraries: a.so: cannot open shared object file: No such file or directory
传递类比前面体的所有方案都麻烦,可以传递结构,也就是一个void*啦
chaker
2013-06-28 19:29:29 +08:00
@nybux 确实是这样,但是我用的时候是先把主函数写好编译完,然后就不能动了。so文件以后随时写随时加载
nybux
2013-06-28 22:36:04 +08:00
可以先生成一个空实现的so文件,用于给主程序编译
以后再慢慢修改so文件,重新生成so文件,不需要再编译主程序。
chaker
2013-06-29 19:19:10 +08:00
@nybux 我用全局变量解决了,在主函数里直接dlsym修改so里的全局变量,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/73947

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX