LD_PRELOAD顾名思义,就是重新加载链接库。
一般用于链接库的重定向,例如linux测试lockdep的测试代码,就使用了此功能。
进入源码中的
cd linux-stable-rt-4.19/tools/lib/lockdep
cat lockdep
LD_PRELOAD="./liblockdep.so $LD_PRELOAD" "$@"
其实大概意思就是
LD_PRELOAD=./liblockdep.so.4.19.148 ./tests/AA
赋值给LD_PRELOAD指定重新加载的动态库,然后运行测试用例AA。 liblockdep.so.4.19.148是我们独立编译出来,用于测试的接口库。
另外,测试程序还使用了#include "xxx.c"的用法,巧妙的将需要的c源文件引用了进来,使编译脚本变得简单,当然,这需要控制源文件的目录不变的前提下。
#include <linux/lockdep.h>
#include <stdlib.h>
#define hlist_for_each_entry_rcu hlist_for_each_entry
#define hlist_add_head_rcu hlist_add_head
#define hlist_del_rcu hlist_del
#define list_for_each_entry_rcu list_for_each_entry
#define list_add_tail_rcu list_add_tail
u32 prandom_u32(void)
{
abort();
}
static struct new_utsname *init_utsname(void)
{
static struct new_utsname n = (struct new_utsname) {
.release = "liblockdep",
.version = LIBLOCKDEP_VERSION,
};
return &n;
}
#include "../../../kernel/locking/lockdep.c"
|