2017-10-13 34 views
0

启用KASLR后,符号文件与实际符号位置之间会有偏移。启用KASLR后,GDB无法正确载入内核符号

% cat /proc/kallsyms| grep '\<jiffies_64\>' 
ffffffff86805000 D jiffies_64 
% objdump -t /usr/lib/debug/boot/vmlinux-4.13.0-1-amd64 | grep '\<jiffies_64\>' 
ffffffff81c05000 g  O .data 0000000000000008 jiffies_64 

找到.text段的位置,所以我可以加载正确的符号文件:

% cat /proc/kallsyms | grep '\<_text\>' 
ffffffff85c00000 T _text 

但是即使我加载符号文件在校正位置:

% sudo gdb -c /proc/kcore 
GNU gdb (Debian 8.0-1) 8.0 
(gdb) add-symbol-file /usr/lib/debug/boot/vmlinux-4.13.0-1-amd64 0xffffffff85c00000 
add symbol table from file "/usr/lib/debug/boot/vmlinux-4.13.0-1-amd64" at 
    .text_addr = 0xffffffff85c00000 
(y or n) y 
Reading symbols from /usr/lib/debug/boot/vmlinux-4.13.0-1-amd64...done. 

GDB仍然给出错误的符号位置:

(gdb) p &jiffies_64 
$1 = (u64 *) 0xffffffff81c05000 <jiffies_64> 

如何强制GDB在正确的位置加载符号?

+0

互联网说,最好的办法是暂时关闭'kaslr'就像@ttsiodras说过。 –

回答

1

在我的小见解中,调试内核非常困难,因为每次重新启动时都不会有符号“跳舞”。

也就是说,它也许值得考虑通过nokaslr到你的内核 - 至少当你正在调试......

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/17802984) – Bart

+0

@Bart:我虚心不同意;这个问题是恕我直言一个XY问题的案例 - 所以我提供了一个答案,解决了根本问题,导致了这个问题...... – ttsiodras