是否可以在共享内存中加载共享库?

时间:2010-05-15 08:51:56

标签: c memory linker shared

我有一个用C编写的服务器和客户端。我尝试在服务器中加载一个共享库,然后将库函数指针传递给客户端。这样我就可以更改库而无需编译客户端。

由于每个进程都有自己独立的内存空间,我想知道是否可以在共享内存上加载共享库,传递函数指针并映射客户端上的共享内存,然后让客户端执行代码服务器加载的库。

2 个答案:

答案 0 :(得分:4)

根据定义,共享库是共享的,因此两个进程将为库的代码段使用相同的物理内存。因此,您可以将库的名称和函数从服务器传递到客户端,而不是编制一些狡猾的方案,客户端将使用dlopen() + dlsym()获取函数地址。

请注意,在这种情况下,将有两个数据段副本(如果库具有一些全局或静态变量),例如如果服务器在库函数中设置了一些static变量,那么客户端的值就不会改变。

答案 1 :(得分:0)

或许,如果操作系统不调用共享内存也可以执行安全问题(可能应该这样做)。

但你不需要。并且,您不应该将指针传递给其他进程。而是在协议中提供函数名称或代码点。共享库机制意味着内存中只有一个库副本,除非操作系统因某种原因决定不共享。如果操作系统决定不共享,那么可能的原因通常会导致指针传递技巧失败。