mips gdb不自动加载共享库信息

时间:2013-04-17 13:15:00

标签: gdb mips backtrace

我看到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是否具有特定信息。

1 个答案:

答案 0 :(得分: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,则会出现段错误,因为mips中的.dynamic部分是只读的。 arm中的.dynamic部分和x86等是可写的。

如果您将mips的.dynamic部分更改为可写,并在动态链接器中打开DT_DEBUG处理,则可以正常工作,但仍然存在一些问题。例如,只读VMA是可写的,在分叉子进程时需要更多页面复制。

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