- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试报告共享库上对 dlopen() 的失败调用导致的所有未解析符号。我已经尝试将 RTLD_LAZY 和 RTLD_NOW 作为 dlopen 调用的标志。我知道共享库有 10 个缺失符号(即,如果您执行静态链接 g++ blah blah :链接将失败,并出现 10 个缺失符号)。我想让 dlerror() 告诉我加载失败期间丢失的所有 10 个符号。
有谁知道如何诱导这种情况发生?我从手册页中看到 dlerror() 返回最后一个错误;所以也许我问的太多了,但想知道是否有人知道。
非常感谢,
最佳答案
I want to get dlerror() to tell me about all of the 10 missing symbols during the failed load.
你不能:加载器一旦发现无法加载库(即一旦发现第一个丢失的符号)就报告错误。加载程序没有任何意义,因此它不会继续。
但是,您可以通过使用 LD_PRELOAD
和 LD_TRACE_LOADED_OBJECTS
来模拟 ldd -r
的作用,以获得完整的答案。示例:
$ cat main.c
#include <dlfcn.h>
#include <stdio.h>
int main()
{
void *p = dlopen("./foo.so", RTLD_NOW);
if (p == NULL) {
printf("%s\n", dlerror());
return 1;
}
return 0;
}
$ cat foo.c
int bar(), baz(); // not defined anywhere
int foo() {
return bar() + baz();
}
$ gcc main.c -ldl; gcc -fPIC -shared -o foo.so foo.c
$ ./a.out
./foo.so: undefined symbol: baz # only the first symbol is reported
$ ldd -r ./a.out
linux-vdso.so.1 => (0x00007fff52ddc000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f158e48d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f158e0ce000)
/lib64/ld-linux-x86-64.so.2 (0x00007f158e6b2000)
那是行不通的,因为您的程序从未执行过,因此也从未加载过 foo.so
。但是 LD_PRELOAD
可以解决问题:
$ LD_BIND_NOW=1 LD_WARN=1 LD_TRACE_LOADED_OBJECTS=1 LD_PRELOAD=./foo.so ./a.out
linux-vdso.so.1 => (0x00007fff3c1b6000)
./foo.so (0x00007ffd33212000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffd3300e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffd32c4f000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffd33414000)
undefined symbol: baz (./foo.so)
undefined symbol: bar (./foo.so)
瞧:现在报告了所有未解析的符号。
关于linux - 如何使 dlerror() 报告来自 dlopen() 加载共享库失败的 *所有* 未解析符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648781/
我在使用 C++/Linux 中的 dlopen 函数时遇到问题。 void * hsiftgpu = dlopen("/full/path/libsiftgpu.so", RTLD_LAZY); 我
我正在开发通过调用脚本自动加载所有 *.so 模块库的系统。 我试图更新其中一个模块以支持 XML-RPC。我在 Ubuntu 10.10 上使用了库 ibxmlrpc-c3-dev。 dlopen(
在 Python 3.8 上运行 Tensorflow 2、Cuda 10.1双 GPU 设置。 GPU被tf2识别,然后最初出现错误找不到cupti64_101.dll(CUDA库) 将 cupti
我有一个 ANSI C 程序,它使用传递 RTLD_LAZY 的 dlopen() 动态加载 .so 文件。我收到了 Undefined symbol "_nss_cache_cycle_preven
我正在尝试报告共享库上对 dlopen() 的失败调用导致的所有未解析符号。我已经尝试将 RTLD_LAZY 和 RTLD_NOW 作为 dlopen 调用的标志。我知道共享库有 10 个缺失符号(即
我正在 mt 计算机上构建 Docker,其中 NVDIA GPU 不可用。我使用 tensorflow/tensorflow Docker 镜像作为带 CPU 的基础镜像。 docker 文件 FR
我安装了 Capistrano 2,但在执行上限时遇到问题命令。操作系统是Windows 2012 R2。所以当我运行时,上限>部署, 显示的错误是, /usr/share/ruby/2.3.0/fi
当我跑 import tensorflow as tf tf.test.is_gpu_available( cuda_only=False, min_cuda_compute_capabili
我在使用 MinGw 在 Windows 上构建 MLT 框架时遇到了一些问题。我尝试按照 http://www.mltframework.org/bin/view/MLT/WindowsBuild
我将 tensorflow v.2.0 降级到 v.1.15 然后我在 ipython 中输入了一些代码进行检查。 但是,cudnn64_7.dll 存在一些问题 (base) C:\Users\pu
我是一名优秀的程序员,十分优秀!