如何将内核调试信息构建为单独的文件?

Posted

技术标签:

【中文标题】如何将内核调试信息构建为单独的文件?【英文标题】:How to build kernel debug info as separate file? 【发布时间】:2014-04-07 11:03:01 【问题描述】:

当我们共享自定义构建的内核时,通常不提供调试信息。

类似于sudo apt-get install linux-image-$(uname -r)-dbgsym,我想为自定义构建的内核创建单独的调试信息文件。

Here 和here 他们进行了一般性的解释。我请求分享为整个 linux 内核创建单独的调试信息文件的知识。

示例程序

$ gcc -g calc.c

$ ls -l
 total 16
-rwxrwxr-x 1 jeyaram jeyaram 8424 Apr  8 09:44 a.out
-rw-rw-r-- 1 jeyaram jeyaram  246 Apr  8 09:32 calc.c

$ objcopy --only-keep-debug a.out a.debug
$ gcc calc.c -------------> compiling without debug info (skipped 'strip')
$ ls -l
total 20
-rwxrwxr-x 1 jeyaram jeyaram 4736 Apr  8 09:45 a.debug
-rwxrwxr-x 1 jeyaram jeyaram 7200 Apr  8 09:52 a.out
-rw-rw-r-- 1 jeyaram jeyaram  246 Apr  8 09:32 calc.c

$ objcopy --add-gnu-debuglink=a.debug a.out
$ gdb a.out
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/jeyaram/JJJ/debug_info_analysis/sample_c_test/a.out...Reading symbols from /home/jeyaram/JJJ/debug_info_analysis/sample_c_test/a.debug...done.
done.

但是在尝试使用 vmlinux 时

$ objcopy --only-keep-debug vmlinux vmlinux.debug
objcopy: Unable to recognise the format of the input file `vmlinux'

缺少什么???

【问题讨论】:

看起来很简单。使用“Kernel hacking”.config 构建内核以创建带有所有调试的映像。运行objcopy --only-keep-debug vmlinux vmlinux.debugstrip vmlinux,并可选择添加链接objcopy --add-gnu-debuglink=vmlinux.debug vmlinuxvmlinux 二进制文件与其他 ELF 文件没有什么不同。如果没有 make/config 选项来创建它,我会感到惊讶;但这些是手动步骤。 【参考方案1】:

vmlinux 是一个二进制 blob。您要查找的文件是 vmlinux.bin(即 elf 中间文件)。

像魅力一样工作:

objcopy --only-keep-debug vmlinux.bin vmlinux.debug

【讨论】:

嗯,它在同一个地方 vmlinux 是:/arch/x86/boot/compressed(用你的arch替换x86)。 我用的是arm,只有vmlinux.lds.in可用。可能我必须关注ronetix.at/an008_ARM_Linux_Debugging.html ???? 我必须使用 arm 版本的 objcopy。错过了;) 唉,我的经验仅限于 PowerPC 和 x86。很可能 ARM 构建有点不同。 感谢您的指导。【参考方案2】:

arm-linux-gnueabi-objcopy --only-keep-debug vmlinux vmlinux.debug 可以正常工作。

$ ls -l vmlinux*
-rwxrwxr-x 1 jeyaram jeyaram   7871108 Apr  8 11:24 vmlinux
-rwxrwxr-x 1 jeyaram jeyaram  92520922 Apr  8 11:21 vmlinux.debug
-rw-rw-r-- 1 jeyaram jeyaram 162974220 Apr  7 14:16 vmlinux.o

【讨论】:

以上是关于如何将内核调试信息构建为单独的文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥打印不出linux内核调试信息

Carbide 不包括某些文件的调试信息

我自己在调试模式下的二进制文件“二进制文件不是用调试信息构建的”

如何编译出带有调试信息的内核模块

如何编译出带有调试信息的内核模块

CLR 调试体系结构