linux共享库的运行方式,linux-构建共享库的“ soname”选项是什么?

soname用于指示您的库支持哪些二进制api兼容性。

链接器在编译时使用NEEDED从库文件确定实际的目标库版本。 gcc -lSONAME将寻找libNAME.so链接或文件,然后捕获其SONAME,它肯定会更加具体(例如libnuke.so链接到包含SONAME libnuke.so.0的libnuke.so.0.1.4)。

在运行时,它将与其链接,然后将其设置为ELF动态节NEEDED,然后应存在具有该名称的库(或指向该库的链接)。在运行时将忽略SONAME,因此仅链接或文件存在就足够了。

备注:SONAME仅在链接/构建时强制执行,而不在运行时强制执行。

库的“ SONAME”可以与“ objdump -p文件| grep SONAME”一起看到。二进制文件“ NEEDED”可以通过“ objdump -p文件| grep NEEDED”看到。

[编辑]警告以下是一般性说明,而不是Linux中部署的说明。 参见最后。

假设您有一个名称为libnuke.so.1.2的库,并开发了一个新的libnuke库:

如果您的新库是以前的修复程序,且未更改api,则应保持相同的名称,增加文件名的版本。 即文件将是libnuke.so.1.2.1,但是soname仍然是libnuke.so.1.2。

如果您有一个仅添加了新功能但没有中断功能并且仍与先前兼容的新库,则您希望使用与先前相同的soname以及一个新的后缀.1.。 即文件和soname将是libnuke.so.1.2.1。 与libnuke.1.2链接的任何程序仍然可以使用该程序。 与libnuke.1.2.1链接的新程序只能与该程序一起使用(直到新的Subversion像libnuke.1.2.1.1一样)。

如果您的新库与任何libnuke不兼容:libnuke.so.2

如果您的新库与旧版本兼容:libnuke.so.1.3 [即仍与libnuke.so.1兼容]

[编辑]完成:Linux情况。

在Linux现实生活中,SONAME作为一种特定形式:lib [NAME] [API-VERSION] .so。[主要版本]major-version只是每个主要库更改时增加的一个整数值。API-VERSION默认为空

前libnuke.so.0

然后,实际文件名包括次要版本和子版本,例如:libnuke.so.0.1.5

我认为不提供soname是一个坏习惯,因为重命名文件会改变其行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是静态?什么是动态? - 静态是在编译时被链接到可执行文件中的,它包含了所有的函数和数据,因此可执行文件较大,但运行时不需要加载额外的文件。 - 动态是在程序运行时被加载的,它包含了多个可执行文件可以共享的函数和数据,因此可执行文件较小,但需要在运行时加载额外的文件。 2. 静态和动态的优缺点是什么? - 静态的优点是可靠性高,因为所有的代码都被编译到可执行文件中,不需要额外的文件。缺点是可执行文件较大,占用磁盘空间较大,且无法在运行时更新文件。 - 动态的优点是可执行文件较小,因为共享文件可以被多个可执行文件共享。缺点是依赖性高,因为需要在运行时加载文件,如果缺少或版本不匹配会导致程序无法运行。 3. 动态的加载过程是怎样的? - 当程序需要访问动态中的函数或数据时,操作系统会检查可执行文件的依赖关系,加载动态文件到内存中,并在符号表中查找相应的函数或数据。 - 如果找到了相应的函数或数据,程序就可以调用函数或访问数据。如果没有找到,操作系统会抛出未定义符号的错误。 4. 如何编译静态和动态? - 编译静态可以使用命令"ar"和"ranlib",例如: ``` gcc -c file1.c file2.c ar rcs libmylib.a file1.o file2.o ``` - 编译动态可以使用命令"gcc"和"-shared"选项,例如: ``` gcc -c -fpic file1.c file2.c gcc -shared -o libmylib.so file1.o file2.o ``` 5. 如何使用静态和动态? - 使用静态可以在编译时链接文件,例如: ``` gcc -o myprog main.c -L/path/to/lib -lmylib ``` - 使用动态可以在程序运行时加载文件,例如: ``` LD_LIBRARY_PATH=/path/to/lib ./myprog ``` 6. 如何避免动态版本不匹配的问题? - 在编译动态时,可以使用版本号来标识不同的版本,例如: ``` gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.0 file1.o file2.o ``` - 在程序中调用函数时,可以使用版本号来指定版本,例如: ``` dlopen("libmylib.so.1", RTLD_NOW); ``` 这样可以确保程序使用正确的版本,并避免版本不匹配的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值