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