为什么 gdb 拒绝加载我的共享对象以及验证操作是什么

Why is gdb refusing to load my shared objects and what is the validation operation

主要问题:

在 Ubuntu 尝试调试 QNX 中的嵌入式应用程序 运行 时,我从 gdb 收到以下错误消息:

warning: Shared object "$SOLIB_PATH/libc.so.4" could not be validated and will be ignored.,

问:什么是“验证”操作?

经过一些研究,我发现 readelf -n libfoo.so 报告的信息包含一个构建 ID,并且将其与某些内容进行比较,可能存在不匹配导致 gdb 拒绝加载库。如果是这样的话 与共享对象的构建 ID 相比,ELF 文件的构建 ID 是什么?我能找到解析可执行文件的信息吗?

更多上下文:

我有这个可执行文件的 .core 文件。我正在使用 QNX 提供的 gdb 版本,并确保在安装 QNX 工具链的位置使用 set sysrootset solib-search-path

我在 Ubuntu 中启动 gdb 的完整命令是:

$QNX_TOOLCHAIN_PATH/ntox86_64-gdb --init-eval-command 'set sysroot $SYSROOT_PATH' --init-eval-command 'set solib-search-path $SOLIB_PATH --init-eval-command 'python sys.path.append("/usr/share/gcc-8/python");' -c path-to-exe.core path-to-executable-bin

Gdb 抱怨它无法加载共享对象:

warning: Shared object "$SOLIB_PATH/libc.so.4" could not be validated and will be ignored.

这里最重要的是确保您使用的是与目标(程序运行的)完全相同的二进制文件。这对于 libc 通常是相当困难的,特别是因为 libc/ldqnx 有时是“同一件事”并且它混淆了 gdb。

最简单的方法是记录您的 mkifs 输出(在 linux 主机上):

make 2>&1 | tee build-out.txt

并通读它,搜索 libc.so.4,然后将被拉到目标上的二进制文件复制到 . (无论你在哪里 运行 gdb)所以你不需要弄乱 SOLIB 路径(懒惰的解决方案)。

或者,scp/ftp 一个新的 libc(一个你想使用的,最好是一个你有相关符号的)到 /tmp 并使用 LD_LIBRARY_PATH 拉那个(和 DL_DEBUG=libs 来确认,如果你需要)。使用相同的 libc 进行调试

资料来源:我在 QNX 工作,有时我们甚至在使用 gdb + libc 时遇到困难