共享对象的实际目的

时间:2014-08-11 06:23:01

标签: c linux shared

共享对象(.so)文件的实际用例是什么?

根据我的理解,它用于链接其他更高级别的语言,如JAVA(JNI)等。此外,它还用于为各种OS风格/处理器架构创建库文件。

如何使用此功能?

例如,如果我想创建一个通用的可执行文件并且需要在各种Linux操作系统中工作,那么可以使用共享对象文件吗?怎么做?

2 个答案:

答案 0 :(得分:1)

要使用共享对象,首先需要创建共享库。它也被称为动态库。

共享库用于动态运行时链接。这意味着在程序运行时,这些共享库被加载到RAM中。

创建动态库或共享库的命令 -

cc -shared -o libany_name.so file1.o file2.o file3.o

其中any_name名称代表您可以为库提供任何名称。对于ex- libadd.so

您可以使用共享库执行程序 -

cc filename.c libany_name.so

创建可执行文件时 -

cc filename.c 

cc filename.c libany_name.so

它将创建一个动态可执行文件。这些动态可执行文件在运行时需要一些依赖文件。这些依赖项文件由编译器自动加载。

要避免这种情况,请使用静态库或静态可执行文件。静态可执行文件包含所有函数本身。可执行文件的大小会更多。

创建静态库的命令 -

ar rcs libany_name.a file1.o file2.o file3.o

创建静态可执行文件的命令 -

cc -static filename.c

答案 1 :(得分:1)

为了补充Satish's answerELF个共享对象通常包含一些共享文本片段(除了一些私有,非共享的片段),这些片段是mmap(2)使用MAP_SHAREDvirtual memory中进行了调整。典型的Linux系统有许多 - shared libraries(例如/usr/lib/lib*.so个文件),因此它们可能共享一些公共RAM(使用相同库的两个不同进程通常会共享其文本段的RAM)和更新它们很容易(如果你更新一些lib*.so未来的程序运行将使用更新版本。)

也可以使用dlopen(3)在运行时动态加载共享对象(然后dlsym以获取其中的一些符号)。这就是加载plugins的方式。加载应用程序必须定义和记录一些约定,例如关于插件中符号的要求以及它们的使用方法。

对此的一个很好的参考是Drepper's paper: How to Write Shared Libraries;另请参阅Levine's book: Linkers and LoadersAdvanced Linux Programming


您的通用可执行目标可能是一种错觉。首先,有不同的Linux系统运行在不同的处理器或ABI(x86 32位,x86-64,x32,ARM)。然后,即使限制为x86-64 Linux,各种发行版也有libc的不同版本以及可执行文件所需的其他库。

最简单的方法是制作你的程序free software(所以发布它的源代码);然后它可以由分销商包装。此外,如果您将软件打包用于常见发行版,这将有所帮助。