静态库 (.a) 和共享库 (.so) 之间的文件格式差异?

2024-04-12

我知道关于共享库和静态库的用例有很多问题,这个问题与此无关。我问的是磁盘上存储的文件格式的差异。

为什么问题是,两者之间有什么区别?或者它们完全相同,只是用途不同?

我相信它们是不一样的,因为在共享库上运行“nm”需要 -D 标志。显然它需要做一些不同的事情。为什么?

它们都是ELF文件吗?

唯一的区别是共享库可以包含一些依赖项路径吗?


静态库,例如libfoo.a不是任何类型的可执行文件。 它只是一个索引存档unix ar format https://en.wikipedia.org/wiki/Ar_(Unix)其他文件恰好是ELF https://en.wikipedia.org/wiki/Executable_and_Linkable_Format对象文件。

静态库的创建方式与任何存档一样:

ar crs libfoo.a objfile0.o objfile1.0...objfileN.o

输出新的存档(c) libfoo.a,插入这些目标文件(r) 并添加索引(s).

你会听说linking libfoo.a在一个程序中。这并不意味着libfoo.a itself链接到程序或与程序链接。代表着libfoo.a作为存档传递给链接器,链接器可以从中提取并链接到 程序只是程序需要的存档中的那些目标文件。 所以静态库的格式(ar格式)只是一个目标文件 链接器输入的捆绑格式:它同样可以是其他捆绑 格式对链接器的任务没有任何影响,即消化一组 目标文件和共享库并生成程序或共享库, 从他们。ar格式是历史的选择。

另一方面,共享库,例如libfoo.so, isELF 文件 而不是任何类型的档案。

不要怀疑静态库是一种 ELF 文件 事实上,所有著名的 ELF 解析器 -objdump, readelf, nm- 将解析静态库。这些工具都知道静态库是 档案ofELF目标文件,因此它们只是解析所有目标文件 在库中,就像您在命令行上列出它们一样。

使用-D选项与nm只是指示工具选择 仅动态符号表中的符号(如果有), 它解析的 ELF 文件的数量 - 运行时链接器可见的符号 - 无论它们是否是从存档中解析的。它是 与objdump -T and readelf --dyn-syms. It is not有必要使用这些选项来解析共享库中的符号。如果 如果你不这样做,那么默认情况下你只会看到full符号表。 如果你跑nm -D在静态库上你会被告知no symbols, 为了 存档中的每个目标文件 - 同样,如果您运行nm -D对于每个 这些目标文件单独。原因是目标文件 没有动态符号表:只有共享库或程序有一个。

目标文件, 共享库 and program都是 ELF 格式的变体。 如果您对 ELF 变体感兴趣,那么这些就是您感兴趣的变体。

ELF格式本身就是一个漫长而棘手的技术阅读,并且是必需的 精确区分变体的背景。简介:ELF 文件 包含一个ELF 头其字段之一包含类型标识符的结构 将文件视为目标文件、共享库或程序。当文件是 程序或共享库,它还包含一个可选的程序头表 结构其字段为运行时链接器/加载器提供参数 它需要在进程中加载​​文件。从ELF结构来看, 程序和共享库之间的差异很小: 使他们的行为产生差异的详细内容 从装载机引出。

对于冗长而棘手的技术阅读,请尝试可执行和可链接格式 (ELF) https://refspecs.linuxfoundation.org/elf/TIS1.1.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态库 (.a) 和共享库 (.so) 之间的文件格式差异? 的相关文章

  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供
  • 修改编译共享库中符号的可见性

    我的项目依赖于一个第三方库 该库导出了更多应有的符号 其中一些符号被其他库和主程序无意地覆盖 如何更改已编译共享对象的函数和变量的可见性 如何更改已编译共享对象的函数和变量的可见性 您可以通过修改动态符号部分来更改符号的可见性 dynsym
  • 安全地记住 bash 脚本中的 ssh 凭据[重复]

    这个问题在这里已经有答案了 假设我有一个 bash 脚本 它通过 ssh 在远程计算机上执行命令 Do something here ssh otheruser host command1 Do something else ssh oth
  • 如何在我的项目中使用 FFTW DLL 导入库 .lib 作为静态 .lib?

    我了解 C 和编译小型插件 始终基于类似且布局的工作流程 虽然目前我需要将最新版本的 FFTW 编译成静态库 或者从编译版本中获取它 这应该会容易得多 但这给了我一个非常困难的时间 可能是因为我不知道编译的来龙去脉 请注意 我正在使用 Vi
  • Web 本地应用程序 Apache:运行 shell 脚本

    我开发了一个 shell 脚本 我想用它创建一个 UI 我决定使用带有本地服务器的 Web 界面 因为我对 HTML PHP 的了解很少 比 QT 或 Java 的了解更多 我只是希望我的 html 可以在我的计算机上运行 shell 脚本
  • 如何手动加载并执行 ELF 二进制可执行文件?

    假设二进制文件是PIC 如何将其加载到内存并执行入口点 我这样做是为了熟悉 ELF 所以execve不允许 这些是基本步骤 阅读程序头以查找 LOAD 指令并确定您需要的映射的总长度 以页为单位 将最低地址的 LOAD 指令映射到总长度 可
  • 使用无效命令进行 fork 会导致 valgrind 中的内存泄漏

    我有以下代码 它在分叉内执行无效命令 以下代码在 valgrind 中返回内存泄漏 include
  • 模拟用户输入以使用不同参数多次调用脚本

    我必须使用提供的脚本 该脚本在脚本运行时接受用户输入而不是参数 我无法解决这个问题 脚本的一个例子是 bin bash echo param one read one doSomething echo param two read two
  • 将一个文件写入.c中的另一个文件

    我有一个读取文件然后将其内容复制到另一个文件的代码 我需要使其仅复制每 20 个符号 然后跳过 10 个符号 然后再次跳过 20 个符号 依此类推 我必须使用 lseek 函数 但我不知道如何将所有这些放入循环中来执行此操作 main ar
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 让“git pull”在拉取不同分支时要求确认

    当同时处理许多项目和分支时 我偶尔会犯一些愚蠢的错误 比如拉入错误的分支 例如在分支上master I did git pull origin dangerous code并且有一段时间没有注意到这一点 这个小错误造成了很大的混乱 当我尝试
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 加载器如何引用共享库中的变量?

    我现在了解如何通过过程链接表引用动态函数 如下所示 Dump of assembler code for function foo plt 0x0000000000400528
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f

随机推荐

  • 如何在 IntelliJ IDEA 中自定义 SonarLint 规则?

    是否可以让 SonarLint for IntelliJ IDEA 仅强制执行我在 Sonar 服务器上启用的规则 因为现在可以使用当前版本的 SonarLint 我使用的版本3 0 0 2041 https plugins jetbrai
  • Rust 中的函数是第一类对象吗?

    函数可以作为参数传递吗 例如 在 JavaScript 中 您可以将函数作为参数传递 如下所示 setInterval function 1000 他们是一流的 与 JavaScript 不同 Rust 有两种类型 函数和闭包 fn fir
  • 在 Clojure 中使用 http://foobar.mp3 重定向到 http://fizzbar.mp3

    我正在尝试以编程方式下载 mp3 文件这个 RSS 提要 http podcast menlo church feed 当我打开一个网址时 例如 http menlohurch podbean com mf feed 5gv2gb 1702
  • 如何找到任何活动应用程序的闪烁光标位置?

    我正在为 Mac OS 开发一个应用程序 我想找到当前应用程序的文本光标 插入符号导航 的位置 到目前为止 我已经让它请求可访问权限 并且我也可以监视 keyEvents 但是如何找到闪烁的光标位置 我不是在寻找鼠标光标位置 我想要文本光标
  • 非实例化 C++ 模板函数的语义正确性

    以下 C 代码无法编译 例如使用 g 4 7 或 clang 3 2 struct Bar template
  • 如何在Python中的多个进程之间共享字典而无需锁定

    我需要在多个进程之间共享一个巨大的字典 大小约为 1 GB 但是因为所有进程都将始终从中读取 我不需要锁定 有没有办法在不锁定的情况下共享字典 python中的多处理模块提供了一个Array类 它允许通过设置共享而无需锁定锁 假然而 多处理
  • 什么是铁轨的良好伐木替代品?

    所以 我一直在研究登录我的 Rails 应用程序 我发现 感谢像这样的帖子this https stackoverflow com questions 462651 rails logger format string configurat
  • Laravel Echo - 允许访客连接到状态通道

    我正在使用 laravel echo server 运行 Laravel Echo 来广播事件 我有一个用户计数器频道 显示应用程序上的所有用户 为此 我使用了存在通道 这对于登录用户来说效果很好 但访客永远无法连接 我在 Broadcas
  • Xml序列化顺序问题

    通常 所有这些都非常适合将我的对象序列化为 Xml 字符串 然后再序列化回对象 然而 不同最终用户之间存在这种不一致 我似乎无法追踪 基本上 当我序列化一个对象时 一旦转换为 Xml 它看起来就像这样
  • 安卓。在对话框中调用关闭

    你打电话时dismiss 在对话框上 除了隐藏它之外 它还会将其从内存中删除吗 它是否会删除放置在对话框内的所有对象 例如ImageViews Buttons等等 凭记忆吗 有没有一种方法可以让我自己释放这些对象的内存 而不是等待垃圾收集器
  • 拖动未修饰的 JFrame 并调整其大小

    目前 我正在使用以下代码来拖动和移动未装饰的 JFrame private void initialiseGUI Component component
  • 使用不同的行终止符在Python中读取csv文件

    我有一个 CSV 格式的文件 其中分隔符是 ASCII 单位分隔符 行终止符是 ASCII 记录分隔符 显然 由于这些是非打印字符 我只是使用了此处编写它们的标准方法之一 我已经编写了大量读取和写入 CSV 文件的代码 因此我的问题不在于
  • Node.js ws 包上的正确错误处理

    我正在努力将基于 REST 的数据管道替换为基于 Websocket 的数据管道 但我无法找到所有可能出错的地方 该系统是生产系统 因此如果出现故障并且无法恢复 将会发生非常糟糕的情况 这是我到目前为止所得到的 客户端 let server
  • 路径组件应该是“/”

    我正在尝试创建一个FileSystem保存 ext2 文件系统的对象 我的URI似乎无效 给我一个路径组件应该是 运行时错误 我使用的是 Windows 我的项目位于 Eclipse 中 有一个名为 fs 的子目录 用于保存文件系统映像 我
  • 如何将 Zend Framework 2 集成到 Netbeans 7.2 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Actor 中的 WebSocket.acceptWithActor 和 @Inject()(播放 2.5)

    WebSocket acceptWithActor不使用 Guice 实例化一个新的 Akka actor 在 Play 2 4 中 仍然可以通过导入来为我的 actor 使用注入器play api Play current 片段来自Rea
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • 如何在magento中添加自定义模块

    您好 我想为页脚创建一个自定义模块 用于显示新闻标题 还没有使用自定义模块 我该怎么做 谁能告诉我创建自定义模块的简单步骤 Thanks 您会发现的最佳资源是 模块创建器扩展 http www magentocommerce com ext
  • 如何在android xml布局中将9个按钮放在3行中?

    我正在尝试制作一个井字游戏 android 版本 我想让所有 9 个按钮根据设备的宽度和高度自动调整大小 并将它们均匀地放在 3 3 网格中 但我现在只能设置它们的尺寸的数字 谁能告诉我如何让他们使用父母的高度和宽度并计算他们的尺寸 另外
  • 静态库 (.a) 和共享库 (.so) 之间的文件格式差异?

    我知道关于共享库和静态库的用例有很多问题 这个问题与此无关 我问的是磁盘上存储的文件格式的差异 为什么问题是 两者之间有什么区别 或者它们完全相同 只是用途不同 我相信它们是不一样的 因为在共享库上运行 nm 需要 D 标志 显然它需要做一