参考以下代码
test_linker.cpp
int main() {
srand(time(0));
for (int i = 0; i < 10; ++i) {
cout << rand() % 10 << endl;
}
return 0;
}
urandom.cpp
#include
using std::cout;
using std::endl;
#include
int rand() throw() {
// get the original rand() function
static auto original_rand = (decltype(&rand)) dlsym(RTLD_NEXT,"rand");
cout << "Call made to rand()" << endl;
return original_rand();
}
当我尝试使用以下命令编译代码时
g++ -std=c++11 -Wall -Werror -Wextra -Wvla -pedantic -O3 urandom.cpp -c
g++ -std=c++11 -Wall -O3 test_linker.cpp urandom.o -ldl
一切正常,但是当我将-ldl标志移动到文件之前时,链接器会抛出一个错误说
urandom.cpp:(.text+0xaf): undefined reference to `dlsym'
问题1有人可以解释为什么会这样吗?我通常不关心编译命令中的标志顺序.
问题2将原始rand()函数的函数指针保持为静态变量也是错误的吗?我不知道动态链接是如何工作的,我担心函数地址可能会在运行时在内存中移动.手册页说,带有RTLD_NEXT句柄的dlsym()函数是一个昂贵的计算,所以我只想懒洋洋地评估一次.
注意:我正在Linux发行版上编译它,并且涉及Linux动态链接器,因此我将继续使用Linux进行标记.