如何解决为什么gdb拒绝加载共享对象以及验证操作是什么
主要问题:
在Ubuntu中尝试调试在QNX中运行的嵌入式应用程序时,我从gdb收到以下错误消息:
warning: Shared object "$SOLIB_PATH/libc.so.4" could not be validated and will be ignored.
,
问:正在进行的“验证”操作是什么?
经过一番研究,我发现readelf -n libfoo.so
报告的信息包含一个build-id,并将其与某些内容进行比较,并且可能存在不匹配的情况,从而导致gdb拒绝加载该库。如果是这种情况,共享对象的ELF文件的build-id与相比?我可以找到分析可执行文件的信息吗?
更多上下文:
我为此可执行文件提供一个 .core 文件。我正在使用QNX提供的gdb版本,并确保在安装QNX工具链的位置使用set sysroot
和set 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 上挣扎
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。