我有一个简单的程序,名为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.2
1.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)