加载调试目标

在上面小节,我们提到为了能够让 gdb 识别变量的符号,我们必须给 gdb 载入符号表等信息。在进行 gdb 本地应用程序调试的时候,因为在指定了执行文件时就已经加载了文件中包含的调试信息,因此不用再使用 gdb 命令专门加载了。但是在使用 qemu 进行远程调试的时候,我们必须手动加载符号表,也就是在 gdb 中用 file 命令。

这样加载调试信息都是按照 elf 文件中制定的虚拟地址进行加载的,这在静态连接的代码中没有任何问题。但是在调试含有动态链接库的代码时,动态链接库的 ELF 执行文件头中指定的加载虚拟地址都是 0,这个地址实际上是不正确的。从操作系统角度来看,用户态的动态链接库的加载地址都是由操作系统动态分配的,没有一个固定值。然后操作系统再把动态链接库加载到这个地址,并由用户态的库链接器(linker)把动态链接库中的地址信息重新设置,自此动态链接库才可正常运行。

由于分配地址的动态性,gdb 并不知道这个分配的地址是多少,因此当我们在对这样动态链接的代码进行调试的时候,需要手动要求 gdb 将调试信息加载到指定地址。

下面,我们要求 gdb 将 linker 加载到 0x6fee6180 这个地址上:

(gdb) add-symbol-file android_test/system/bin/linker 0x6fee6180

这样的命令默认是将代码段(.data)段的调试信息加载到 0x6fee6180 上,当然,你也可以通过“-s”这个参数来指定,比如: (gdb) add-symbol-file android_test/system/bin/linker –s .text 0x6fee6180

这样,在执行到 linker 中代码时 gdb 就能够显示出正确的代码和调试信息出来。

这个方法在操作系统中调试动态链接器时特别有用。

results matching ""

    No results matching ""