小编wal*_*lly的帖子

共享库小版本管理

我有一个简单的程序,名为main

#include <iostream>
#include "random.h"

int main()
{
        std::cout << "The program has started\n";
        return get_another_random_number();
}
Run Code Online (Sandbox Code Playgroud)

get_another_random_number()函数位于新版本的共享库中,但仅安装了旧版本。程序开始运行,但稍后当查找失败时崩溃;例如

$ ./main
The program has started
./main: symbol lookup error: ./main: undefined symbol: _Z25get_another_random_numberv
Run Code Online (Sandbox Code Playgroud)

例如,如果librandom.so.1.3.1包含一个名为 的函数get_another_random_number(),但main在刚刚安装的服务器上执行,就会发生这种情况librandom.so.1.2.5。这些库仅在次要版本上有所不同,因为该版本与库的版本1.3向后兼容,但缺少额外的功能。1.21.2

在我自己的例子中,如果我运行readelf -d main | grep NEEDED我会得到:

 0x0000000000000001 (NEEDED)             Shared library: [librandom.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED) …
Run Code Online (Sandbox Code Playgroud)

dynamic-linking system-installation shared-library

5
推荐指数
1
解决办法
770
查看次数