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

静态库,例如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结构方面,

程序和共享库之间的差异很小:它是

详细的内容,使他们的行为有所不同

从装载机中引出.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值