【问题标题】:Actual purpose of Shared object [duplicate]共享对象的实际用途 [重复]
【发布时间】:2014-10-03 21:48:44
【问题描述】:

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

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

如何使用此功能?

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

【问题讨论】:

标签: c linux shared


【解决方案1】:

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

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

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

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

其中any_name name 表示您可以为库指定任何名称。对于前 libadd.so

您可以通过共享库执行您的程序-

cc filename.c libany_name.so

当你创建一个可执行文件时-

cc filename.c 

cc filename.c libany_name.so

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

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

创建静态库的命令-

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

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

cc -static filename.c

【讨论】:

    【解决方案2】:

    为了补充Satish's answerELF 共享对象通常有一些共享 文本段(除了一些私有的、非共享的段),它们是mmap(2)-ed in virtual memory使用MAP_SHARED。一个典型的 Linux 系统有许多 -hundreds-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(所以发布它的源代码);然后它可以由分销商打包。此外,如果您将软件打包为常见的发行版,也会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 2018-02-02
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2014-06-19
      相关资源
      最近更新 更多