我有一个用 C 编写的服务器和一个客户端。我尝试在服务器中加载一个共享库,然后将库函数指针传递给客户端。这样我就可以更改库而无需编译客户端。
因为每个进程都有自己独立的内存空间,我想知道是否可以在共享内存上加载共享库,在客户端传递函数指针和映射共享内存,然后让客户端执行库的代码由服务器加载。
根据定义,共享库是共享的,因此两个进程将使用相同的物理内存来存储库的代码段。因此,您可以将库和函数的名称从服务器传递到客户端,而不是编写一些狡猾的方案,客户端将使用dlopen()
+获取函数地址dlsym()
。
请注意,在这种情况下,将有两个数据段副本(如果库有一些全局或静态变量),例如,如果服务器static
在库函数中设置了一些变量,它的值对于客户端不会改变。
如果操作系统不调用使共享内存也可执行一个安全问题(它可能应该),您也许可以。
但你不需要。而且,您不应该将指针传递给其他进程。相反,在您的协议中给出函数名称或代码点。共享库机制意味着内存中只有一个库副本,除非操作系统出于某种原因决定不共享。如果操作系统决定不共享,可能的原因通常会导致您的指针传递技巧也失败。