如何在c中的两个程序之间共享库

时间:2014-01-30 11:54:23

标签: c linux operating-system shared-libraries cpu-cache

我想在C中的两个不同程序中使用相同的库函数(即OpenSSL库)进行计算。如何确保两个程序都使用公共库,意味着一个库的副本被加载到共享主内存,并且两个程序都从该内存位置访问该库计算

例如,当第一个程序访问库进行计算时,它将从主内存加载到缓存中,当第二个程序稍后想要访问它时,它将从缓存中访问数据(已由第一个程序加载),再次从主内存

我在Linux下使用GCC。任何解释或指针都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

操作系统共享代码,不仅是共享库,还有同一二进制文件的可执行文件 - 您无需执行任何操作即可拥有此功能。它是系统内存管理的一部分。

两个进程之间不会共享数据。您需要一个进程中的线程来共享数据。但除非您需要,否则只需确保两个程序使用完全相同的共享库文件(.so文件)。通常你不必考虑那个;如果两个程序使用库的不同版本(它们当然不会共享),这可能很重要。

查看ldd /path/to/binary的输出,看看二进制文件使用了哪些共享库。

答案 1 :(得分:2)

阅读Drepper的论文How to Write Shared LibrariesProgram Library HowTo

要创建一个,请将代码编译为position independent code,例如

 gcc -c -fPIC -O -Wall src1.c -o src1.pic.o
 gcc -c -fPIC -O -Wall src2.c -o src2.pic.o

然后将其链接到共享对象

 gcc -shared src1.pic.o src2.pic.o -lsome -o libfoo.so

您可以将共享库-lsome链接到另一个libfoo.so

在内部,动态链接器ld-linux.so(8)正在使用mmap(2)(并且会在动态链接时执行一些relocation),重要的是inodes。内核将使用文件系统缓存来避免两次读取不同进程使用的共享库。另请参阅linuxatemyram.com

使用例如ldd(1)pmap(1)proc(5)。另见dlopen(3)。尝试

cat /proc/self/maps

了解运行该cat命令的address space所使用的virtual memoryprocess;并非ELF共享库的所有内容都在进程之间共享,只有一些段,包括text segment ...