繁体   English   中英

在Linux上的gdb中加载核心文件时,如何在库路径前添加目录

[英]How do I prepend a directory the library path when loading a core file in gdb on Linux

我有一个在远程系统上生成的核心文件,我没有直接访问权限。 我还有来自远程系统的库文件的本地副本,以及崩溃程序的可执行文件。

我想在gdb中分析这个核心转储。

例如:

gdb path/to/executable path/to/corefile

我的库位于当前目录中。

在过去,我见过调试器通过提供选项“-p”来实现它。 或“-p / =。”; 所以我的问题是:

在分析gdb中的核心文件时,如何指定首先从相对于当前目录的路径加载库?

在不指定可执行文件或核心文件的情况下启动gdb,然后键入以下命令:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

您需要确保完全从目标系统镜像库路径。 以上内容适用于调试与主机不匹配的目标,这就是复制包含库的根文件系统结构的重要原因。

如果您正在远程调试与主机相同的架构和Linux / glibc版本的服务器,那么您可以按照fd建议执行:

set solib-search-path <path>

如果您试图覆盖某些库,但不是全部,那么您可以将目标库目录结构复制到临时位置并使用上述solib-absolute-prefix解决方案。

我不确定这在gdb中是否可行,但后来我不是专家。

但是我可以对Linux动态链接器发表评论。 以下内容应该打印所有已解析的共享库和未解析的共享库的路径。

ldd path/to/executable

我们需要知道您的共享库如何与您的可执行文件链接。 为此,请使用以下命令:

readelf -d path/to/executable | grep RPATH
  • 如果命令不打印,动态链接器将使用标准位置和LD_LIBRARY_PATH环境变量来查找共享库。

  • 如果命令打印某些行,则动态链接器将忽略LD_LIBRARY_PATH并使用硬编码的rpath。

    如果列出的rpath是绝对的,我知道的唯一解决方案是将库复制(或符号链接)到列出的位置。

    如果列出的rpath是相对的,它们将包含$ ORIGIN,它将在运行时由可执行文件的路径替换。 移动可执行文件或库以匹配。

有关更多信息,您可以从以下开始:

man ld.so

我在developer.apple.com上找到了这段摘录

 set solib-search-path path 

如果设置了此变量,则path是以冒号分隔的目录列表,用于搜索共享库。 solib-search-path' is used after solib-absolute-prefix'无法定位库之后使用,或者库的路径是相对的而不是绝对的。 如果要使用solib-search-path' instead of solib-absolute-prefix',请确保将`solib-absolute-prefix'设置为不存在的目录,以防止GDB找到主机的库。

编辑:

我不认为使用上面的设置会预先添加我添加的目录,但它似乎会附加它们,因此我在当前系统中丢失的文件会在我添加的路径中被选中。 我想将solib-absolute-prefix设置为虚假的东西,并按照我需要的顺序在solib-search-path中添加目录可能是一个完整的解决方案。

您还可以在调用gdb时将LD_PRELOAD设置为每个库,或者将LD_LIBRARY_PATH设置为当前目录。 如果gdb本身尝试使用您正在预加载的任何库,这只会导致问题。

一个重要的说明:

如果您正在进行交叉编译并尝试使用gdb进行调试,那么在您完成之后
如果你看到smth,请file ECECUTABLE_NAME 喜欢 :

Using host libthread_db library "/lib/libthread_db.so.1"

然后检查您的目标系统是否有libthread_db。 我在网上发现了很多类似的问题。 仅使用“set solib-”无法解决此类问题,您还必须使用交叉编译器构建libthread_db。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM