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

前端之家收集整理的这篇文章主要介绍了linux – 静态库(.a)和共享库(.so)之间的文件格式差异?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道有很多关于共享和静态库的用例的问题,这个问题与此无关.我问的是存储在磁盘上的文件格式的差异.

为什么问题是,两者之间有什么区别?或者它们是否完全相同,仅在使用方面有所不同?

我认为它们不一样,因为在共享库上运行’nm’需要-D标志.显然,它需要做一些不同的事情.为什么?

它们都是ELF文件吗?

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

解决方法

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

像任何存档一样创建静态库:

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

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

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

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

不要试图怀疑静态库是一种ELF文件
事实上所有着名的ELF解析器 – objdump,readelf,nm –
将解析一个静态库.这些工具都知道静态库
ELF目标文件的存档,因此它们只解析所有目标文件
在库中,就像你在命令行上列出它们一样.

在nm中使用-D选项只是指示工具选择
仅限动态符号表中的符号(如果有)
它解析的ELF文件的大小 – 运行时链接程序可见的符号
– 无论是否从存档中解析它们.它的
与objdump -T和readelf –dyn-syms相同.它不是
必须使用这些选项来解析共享库中的符号.如果
你没有这样做,那么默认情况下你只会看到完整的符号表.
如果你在静态库上运行nm -D,你将被告知没有符号
归档中的每个目标文件 – 同样如果你为每个目标运行了nm -D
那些目标文件.原因是一个目标文件
没有动态符号表:只有共享库或程序有一个.

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

ELF格式本身是一个冗长而棘手的技术阅读,是必需的
准确区分变体的背景.简介:ELF文件
包含一个ELF头结构,其中一个字段包含一个类型标识符
文件作为目标文件,共享库或程序.当文件
程序或共享库,它还包含一个可选的程序头表
结构,其字段为运行时链接程序/加载程序提供参数
它需要在进程中加载​​文件.在ELF结构方面,
程序和共享库之间的差异很小:它是
详细的内容,使他们的行为有所不同
从装载机中引出.

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

猜你在找的Linux相关文章