gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:12:41 34 4
gpt4 key购买 nike

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

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

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

它们都是ELF文件吗?

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

最佳答案

静态库,例如libfoo.a 不是任何类型的可执行文件。它只是 unix ar format 中的索引存档其他文件恰好是 ELF目标文件。

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

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

输出新存档 (c) libfoo.a,其中插入了那些目标文件 (r)并添加了索引 (s)。

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

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

不要怀疑静态库是一种 ELF 文件事实上,所有著名的 ELF 解析器 - objdumpreadelfnm -将解析一个静态库。这些工具都知道静态库是ELF 对象文件的归档 ,因此它们只解析所有对象文件在库中,就好像您已在命令行中列出它们一样。

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

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

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

对于冗长而棘手的技术阅读,请尝试 Excutable and Linkable Format (ELF)

关于linux - 静态库 (.a) 和共享库 (.so) 之间的文件格式差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41879433/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com