实际目的的 Shared object

10 浏览
0 Comments

实际目的的 Shared object

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

根据我的理解,它用于与其他高级语言(如JAVA(JNI)等)进行链接。此外,它还用于为各种操作系统版本/处理器架构创建库文件。

如何使用这个特性?

例如,如果我想创建一个通用的可执行文件,并且需要在所有Linux操作系统版本中运行,可以使用共享对象文件吗?如何实现这一点?

0
0 Comments

共享对象的实际目的是为了在不同的进程之间共享代码段,从而节省内存,并且方便更新。Linux系统上通常有许多共享库文件,它们可以被不同的进程共享,这样当某个共享库文件被更新后,使用该库的程序将会使用更新后的版本。共享对象也可以在运行时使用dlopen(3)动态加载,并使用dlsym获取其中的符号。这也是插件被加载的方式。加载应用程序必须定义和记录一些约定,例如插件中应该包含哪些符号以及如何使用这些符号。

在Linux系统上,不同的处理器或ABI有不同的规范,而且即使限定在x86-64 Linux上,各个发行版也有不同版本的libc和其他所需库文件。因此,编写一个通用的可执行文件可能是一种幻想。

最简单的方法是将程序作为自由软件发布,这样它的源代码可以被发行版制作者打包。此外,如果您为常见的发行版打包软件,也会有所帮助。

0
0 Comments

Shared objects(共享对象)的实际目的是为了在程序运行时动态加载库文件。为了使用共享对象,首先需要创建一个共享库,也称为动态库。创建共享库的命令是cc -shared -o libany_name.so file1.o file2.o file3.o,其中any_name可以是任意名称。可以通过cc filename.c libany_name.so的方式来执行程序并使用共享库。

当创建可执行文件时,可以使用命令cc filename.ccc filename.c libany_name.so来创建动态可执行文件。这些动态可执行文件在运行时需要一些依赖文件,这些依赖文件会被编译器自动加载。

为了避免这种情况,可以选择使用静态库或静态可执行文件。静态可执行文件包含所有的函数,因此文件的大小会更大。创建静态库的命令是ar rcs libany_name.a file1.o file2.o file3.o,创建静态可执行文件的命令是cc -static filename.c

因此,共享对象的出现是为了在程序运行时动态加载库文件。为了避免依赖文件的加载,可以选择静态库或静态可执行文件。

0