Gentoo Archives: gentoo-dev

From: Martin Kletzander <nert.pinx@×××××.com>
To: gentoo-dev@l.g.o
Subject: [gentoo-dev] Re: Systemtap with dist-kernel
Date: Thu, 16 Jun 2022 15:24:33
Message-Id: YqtLKldI5QnrGP5H@wheatley
In Reply to: [gentoo-dev] Systemtap with dist-kernel by Martin Kletzander
1 I finally figured out what is happening, but I am not sure what would be
2 the best way to work around it.
3
4 The problem is that with FEATURES=splitdebug the vmlinux binary is being
5 processed by estrip, which uses debugedit and specifically asks it to
6 recompute the build id. However, the bzImage is created from the
7 vmlinux *before* that, and thus preserves the old build-id.
8
9 One option would be to create the vmlinux.debug file manually, but I am
10 afraid it would duplicate lot of the code from estrip, unless it can
11 somehow be uses cleanly by the ebuild. The advantage of this would be
12 that there is no need for the huge vmlinux file after that and we can
13 just keep the vmlinux.debug around instead.
14
15 I'll end with a couple of closing questions if I may:
16
17 - Does anyone have an idea for some a clean way to do this?
18
19 - Is it preferable to use GitHub PRs or this ML for such eclass changes?
20
21 - What is exactly the reason for portage using the `-i`/`--build-id`
22 option of debugedit?
23
24 Thanks and have a nice day,
25 Martin
26
27 On Fri, Jun 10, 2022 at 02:22:00PM +0200, Martin Kletzander wrote:
28 >Hello,
29 >
30 >I am trying to make systemtap work with gentoo-kernel (or ideally all
31 >dist kernels) and I got a few steps closer with kernel-build.eclass
32 >modification I sent this week [0]. However there is still one issue and
33 >that is the fact that build-id of the kernel does not match the
34 >installed vmlinux file:
35 >
36 ># stap mba_sc.stp
37 >WARNING: Build-id mismatch [man warning::buildid]:
38 >"/usr/src/linux-5.17.13-gentoo-dist/vmlinux" pid 0 address
39 >0xffffffff8a7b572c, expected c43e775aad5e11755bf5cf1329d2240b519e7518
40 >actual 3a757e0a2b0d777762cd4aaf9cac0c40bc8c398c
41 >WARNING: /usr/bin/staprun exited with status: 1
42 >Pass 5: run failed. [man error::pass5]
43 >
44 >I also noticed that when kernel-build.eclass installs the vmlinux file
45 >it also (I presume portage) creates vmlinux.debug using objcopy
46 >--only-keep-debug --compress-debug-sections.
47 >
48 >So now I am in a situation where I have these relevant files on the
49 >system:
50 >
51 >- /usr/src/linux-5.17.13-gentoo-dist/vmlinux
52 >- /usr/lib/debug/.build-id/c4/3e775aad5e11755bf5cf1329d2240b519e7518.debug
53 > (symlink to the first file)
54 >- /usr/lib/debug/usr/src/linux-5.17.13-gentoo-dist/vmlinux.debug and
55 >- /boot/vmlinuz-5.17.13-gentoo-dist
56 >
57 >
58 >When I check the build ids (using readelf -n or just "file") of the
59 >first three files I get:
60 >
61 >/usr/src/linux-5.17.13-gentoo-dist/vmlinux:
62 >ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
63 >BuildID[sha1]=c43e775aad5e11755bf5cf1329d2240b519e7518, not stripped
64 >
65 >/usr/lib/debug/.build-id/c4/3e775aad5e11755bf5cf1329d2240b519e7518.debug:
66 >ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
67 >BuildID[sha1]=c43e775aad5e11755bf5cf1329d2240b519e7518, with debug_info,
68 >not stripped
69 >
70 >/usr/lib/debug/usr/src/linux-5.17.13-gentoo-dist/vmlinux.debug:
71 >ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
72 >BuildID[sha1]=c43e775aad5e11755bf5cf1329d2240b519e7518, with debug_info,
73 >not stripped
74 >
75 >which looks great except:
76 >
77 >1) the first file does not say it is "with debug_info",
78 >
79 >2) there is no reason to keep the original vmlinux in place since there
80 > is a smaller file that works as a substitute, but I'm not sure what's
81 > a clean way to not install it, and most importantly
82 >
83 >3) the fact that the running kernel has a different build id.
84 >
85 >The last point is the main issue here. I was trying to find how to
86 >check for the build id of the running kernel, but haven't found any way
87 >on how to do it with a kernel API, so instead I checked the
88 >/boot/vmlinuz-5.17.13-gentoo-dist like this:
89 >
90 >~/dev/linux/scripts/extract-vmlinux /boot/vmlinuz-5.17.13-gentoo-dist >vmlinux.extracted
91 >
92 >and for good measure also tried what objcopy does to it:
93 >
94 >objcopy --only-keep-debug vmlinux.extracted vmlinux.extracted.debug
95 >objcopy --only-keep-debug --compress-debug-sections vmlinux.extracted vmlinux.extracted.compressed
96 >
97 >Now when I check the build id is different from the first files, but
98 >unchanged with objcopy and same as systemtap reports for the running
99 >kernel:
100 >
101 >vmlinux.extracted:
102 >ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
103 >BuildID[sha1]=3a757e0a2b0d777762cd4aaf9cac0c40bc8c398c, stripped
104 >
105 >vmlinux.extracted.compressed:
106 >ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
107 >BuildID[sha1]=3a757e0a2b0d777762cd4aaf9cac0c40bc8c398c, stripped
108 >
109 >vmlinux.extracted.debug:
110 >ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
111 >BuildID[sha1]=3a757e0a2b0d777762cd4aaf9cac0c40bc8c398c, stripped
112 >
113 >
114 >At this point I got stuck, not knowing when and how does the build-id
115 >changes and where to extract the debug symbols from. I would also like
116 >to clean up the change I did. So I came here with my question(s) and
117 >rather lengthy explanations. Does anyone know what would be the best
118 >way to deal with this? Or even where to continue looking? I would
119 >really like to make systemtap "just work" on Gentoo with the
120 >distribution kernels, but I already spent a lot of time on it, so I
121 >figured I'll rather ask here since I'm not that proficient with the
122 >intricacies of the build system parts.
123 >
124 >Thanks a lot for any pointers and have a great day,
125 >Martin
126 >
127 >[0] https://github.com/gentoo/gentoo/pull/25789

Replies

Subject Author
[gentoo-dev] Re: Systemtap with dist-kernel Martin Kletzander <nert.pinx@×××××.com>