解决方法
根据我的理解,每个可执行对象都有自己的“查找范围”:
>主可执行文件通常是“全局”查找范围中的第一个对象.这意味着主可执行文件中定义的符号将覆盖依赖共享库中的符号.使用LD_PRELOAD工具添加的共享对象将添加到主可执行文件后面的全局查找范围中.
>但是,如果正在加载的共享对象使用DF_SYMBOLIC标志,则在该对象中生成的符号引用将在搜索全局查找范围之前查找对象内的定义.
>使用dlopen()打开的共享对象可能有自己的依赖项.如果在调用dlopen()期间未设置RTLD_GLOBAL标志,则会将这些依赖项添加到该对象的查找范围,但不会影响全局查找范围.如果将RTLD_GLOBAL标志传递给dlopen(),则共享对象(及其依赖项)将添加到“全局”查找范围,从而更改后续符号查找的行为.
Ulrich Drepper的指南“How to Write Shared Libraries”建议阅读此主题.