实际目的的 Shared object
共享对象的实际目的是为了在不同的进程之间共享代码段,从而节省内存,并且方便更新。Linux系统上通常有许多共享库文件,它们可以被不同的进程共享,这样当某个共享库文件被更新后,使用该库的程序将会使用更新后的版本。共享对象也可以在运行时使用dlopen(3)动态加载,并使用dlsym获取其中的符号。这也是插件被加载的方式。加载应用程序必须定义和记录一些约定,例如插件中应该包含哪些符号以及如何使用这些符号。
在Linux系统上,不同的处理器或ABI有不同的规范,而且即使限定在x86-64 Linux上,各个发行版也有不同版本的libc和其他所需库文件。因此,编写一个通用的可执行文件可能是一种幻想。
最简单的方法是将程序作为自由软件发布,这样它的源代码可以被发行版制作者打包。此外,如果您为常见的发行版打包软件,也会有所帮助。
Shared objects(共享对象)的实际目的是为了在程序运行时动态加载库文件。为了使用共享对象,首先需要创建一个共享库,也称为动态库。创建共享库的命令是cc -shared -o libany_name.so file1.o file2.o file3.o
,其中any_name
可以是任意名称。可以通过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
。
因此,共享对象的出现是为了在程序运行时动态加载库文件。为了避免依赖文件的加载,可以选择静态库或静态可执行文件。