微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么是.so.2文件?

我使用GCC从源代码编译英特尔TBB。 它生成一个libtbb.so和littbb.so.2。 看起来.so.2文件是真正的共享库,libtbb.so只是包含一行文本INPUT (libtbb.so.2)

生成这两个文件而不是一个的目的是什么? 对于INPUT (libtbb.so.2) ,语法是什么? 我想了解更多。

加载boost的共享库时出错

依赖于相同静态链接库的可执行文件和共享库

是否有可能定义一个函数指针到一个构造函数

用g ++dynamic共享库编译

在运行时加载Linux库

通常,当您构建共享对象(.so)时,您还可以通过添加后缀(如mylib.so.2.3.1)来处理版本。 为了确保你的程序可以加载这个lib或其他更新的版本,你可以使用名字创建链接

mylib.so -> mylib.so.2.3.1 mylib.so.2 -> mylib.so.2.3.1 mylib.so.2.3 -> mylib.so.2.3.1

因此,.so后面的所有内容代表version.sub-version.build(或类似)。另外,同一个lib的多个版本可能与此方案共存,并且只需将所有程序切换为使用特定版本是有适当的链接到位。

动态链接的ELF二进制文件(无论是另一个库还是一个可执行文件)使用共享对象名称或soname来标识在执行时可执行文件链接的库。

一个库被创建为一个ELF共享库时,编译时链接编辑器将一个DT_SONAME字段插入到该库的SONAME库中的可执行文件中。 DT_SONAME在ELF标准中被定义为:

这个元素包含一个以null结尾的字符串的字符串表偏移量,给出了共享对象的名字。 偏移量是记录在DT_STRTAB条目中的表的索引。 有关这些名称的更多信息,请参见下面的“共享对象依赖关系”。

所以现在当一个可执行文件被创建时,SONAME被嵌入到其中。 当运行可执行文件时,链接器使用该文件在动态库的预先指定位置的文件中查找库。 窗口中的预定义位置将位于DLL所在的位置。 在Linux和Mac OS X以及其他System V兼容系统中,它们将是/lib和/usr/lib以及可能的其他位置,这取决于所使用的链接器,并且可以在链接器自己的配置中定义。

在所有的事件中,链接器都会查看soname条目中是否存在任何位置的库,是否会使用它。

请注意,标准说soname是一个STRING,版本约定成为事实上的事实标准,如下所示:

使soname为libmyname.so.A ,并使库文件名为libmyname.so.AB或libmyname.so.ABC(在MacOSX下是libmyname.ABdylib)。 从libmyname.so.AB[.C]?创建一个链接libmyname.so.AB[.C]? 到libmyname.so.A 。

A保持不变,而图书馆的ABI保持不变。

B (或BC )成为次要版本。

在Linux下,库的版本和软件包的版本号是一样的。 这有其优点和缺点。

libtool形式化

GNU libtool被用来构建动态库,并有一个更正式的版本控制系统,并具有强大的逻辑。 soname的libtool版本控制系统工作得很好,被复杂的图书馆采用,以保持直线。

在libtool下,版本控制如下:

libmylib- 当前释放年龄

在libtool下的想法是,随着图书馆的发展,他们将添加删除功能

假设你正在开发一个库。 首先使用版本0.0.0 。

现在让我们假设你修复了一些错误,你只会增加版本号。

因此,新的名称将来到libmylib.0.1.0或libmylib.0.2.0等。每个版本只修复错误,但不会更改任何ABI。

一路上你说。 啊! 我可以更好地完成这个子功能,所以你增加了一套新的功能来做更好的事情,但是因为其他人仍然在使用你的库,所以你仍然保留旧的(不赞成的)功能

规则如下:

从每个libtool库的版本信息“0:0:0”开始。

仅在公开发行软件之前立即更新版本信息。 更频繁的更新是不必要的,只保证当前的接口号码变得更快。

如果自上次更新以来库源代码已经改变,则增量修订('c:r:a'变为'c:r + 1:a')。

如果自上次更新以来已添加删除或更改了任何接口,则将当前值增加,并将修订版本设置为0。

如果自上次公开发布以来添加了任何接口,则增加年龄。

如果自上次公开发布以来删除或更改了任何接口,则将age设置为0。

您可以在libtool文档中阅读更多关于它的信息

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐