1

我已经看到gdb自动读取和加载符号。(就像下面的代码读取ld-linux-x86-64.so.2

----------

gdb 86exec 86core
...
Reading symbols from 86exec...done.

Illegal process-id: 86core.

[New Thread 14983]

[New Thread 14978]

[New Thread 14980]

[New Thread 14981]

[New Thread 14982]
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/ld-linux-x86-64.so.2

Core was generated by `./86exec'.

Program terminated with signal 11, Segmentation fault.


----------

但在我的mips平台上,我没有完成自动阅读。

---------


Reading symbols from /mipsexec...done.

[New LWP 1333]

[New LWP 1328]

[New LWP 1330]

[New LWP 1331]

[New LWP 1332]

Core was generated by `./mipsexec'.

Program terminated with signal 11, Segmentation fault.


----------

我想知道,这些信息是从哪里来的。

如果它来自核心文件,我如何分析我mipscore是否有具体信息。

4

1 回答 1

0

我怀疑 mips gdb 不能很好地支持 PIE。据我所知,在 PIC 中,mips 使用rld_map但不DE_DEBUG用于动态信息,但在 PIE 模式下,mips 喜欢其他架构,使用DT_DEBUG.

在动态链接器中,有这样的语句:

#if !defined __mips__
        /* we disable for mips because normally this page is readonly
         * and modifying the value here needlessly dirties a page.
         * see this post for more info:
         * http://uclibc.org/lists/uclibc/2006-April/015224.html */
        if (dpnt->d_tag == DT_DEBUG)
            dpnt->d_un.d_val = (unsigned long)debug_addr;
#endif

PIC 中的这个语句是可以的,但在 PIE 中不起作用。如果你删除这个#ifdef,你会得到一个段错误,因为.dynamicmips 中的部分是只读的。.dynamicarm 和 x86 等中的部分是可写的。

如果您将.dynamicmips 的部分更改为可写,并DT_DEBUG在动态链接器中打开处理,它可以工作,但仍然存在一些问题。例如,只读的 VMA 是可写的,并且在 fork 子进程时需要更多的页面副本。

几周前我遇到了这个问题,我不知道 mips gdb 是否在 Android 4.2 中运行良好。在 Android 4.2 中,所有 c/c++ 文件都是使用 PIE 构建的。

于 2013-07-15T09:42:22.697 回答