Hello!
I am trying to understand something unexpected I am seeing in the relocations
placed into a compiled Linux kernel for the .debug_info section. Those
relocations seem to change the names of various entries in the debug info:
[65] .debug_info PROGBITS 0000000000000000 02c284e0
000000000c458644 0000000000000000 0 0 1
[66] .rela.debug_info RELA 0000000000000000 16081790
000000001288ae68 0000000000000018 I 78 65 8
[72] .debug_str PROGBITS 0000000000000000 10b451e8
00000000002bef2e 0000000000000001 MS 0 0 1
Dumping the DWARF information for one of the CUs in the compiled image (with
standard tooling) shows me:
0x0000002d: DW_TAG_compile_unit
DW_AT_producer ("GNU C89 8.3.1 20191121 (Red Hat 8.3.1-5)
-mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -mno-80387
-mno-fp-ret-in-387 -mpreferred-stack-boundary=3 -mskip-rax-setup -mtune=generic
-mno-red-zone -mcmodel=kernel -mindirect-branch=thunk-extern
-mindirect-branch-register -mrecord-mcount -mfentry -march=x86-64 -g -gdwarf-4
-O2 -std=gnu90 -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE
-falign-jumps=1 -falign-loops=1 -funit-at-a-time
-fno-asynchronous-unwind-tables -fno-jump-tables
-fno-delete-null-pointer-checks -fstack-protector-strong
-fno-inline-functions-called-once -fno-strict-overflow -fno-merge-all-constants
-fmerge-constants -fstack-check=no -fconserve-stack --param
allow-store-data-races=0")
DW_AT_language (DW_LANG_C89)
DW_AT_name ("arch/x86/kernel/head64.c")
DW_AT_comp_dir
("/usr/src/debug/kernel-4.18.0-193.el8/linux-4.18.0-193.el8.x86_64")
DW_AT_ranges (0x000009d0
[0xffffffff81002000, 0xffffffff81002008)
[0xffffffff82977172, 0xffffffff829771c0)
[0xffffffff829771c0, 0xffffffff8297727a)
[0xffffffff8297727a, 0xffffffff829774f8)
[0xffffffff829774f8, 0xffffffff82977518)
[0xffffffff82977518, 0xffffffff8297759f)
[0xffffffff81000200, 0xffffffff810005b9)
[0xffffffff8297759f, 0xffffffff829775bc))
DW_AT_low_pc (0x0000000000000000)
DW_AT_stmt_list (0x00000126)
0x00000d84: DW_TAG_structure_type [55] *
DW_AT_name [DW_FORM_strp] (
.debug_str[0x0023ff94] = "task_struct")
DW_AT_byte_size [DW_FORM_data2] (0x2480)
DW_AT_alignment [DW_FORM_data1] (0x40)
DW_AT_decl_file [DW_FORM_data1]
("/usr/src/debug/kernel-4.18.0-193.el8/linux-4.18.0-193.el8.x86_64/./include/linux/sched.h")
DW_AT_decl_line [DW_FORM_data2] (589)
DW_AT_decl_column [DW_FORM_data1] (0x08)
DW_AT_sibling [DW_FORM_ref4] (cu + 0x19cc =>
{0x000019ee})
As I'd expect, the name of the structure with the DWARF DIE at offset 0xd84 is
"task_struct". A hex dump of this part of .debug_info within the compiled
image confirms the 0x23ff94 offset into the string table:
02c29260 47 0d 00 00 37 **94 ff 23 00** 80 24 40 22 4d 02 08
|G...7..#..$@"M..|
02c29270 cc 19 00 00 02 28 a5 19 00 22 53 02 16 bb 49 00
|.....(..."S...I.|
02c29280 00 00 02 77 0a 11 00 22 56 02 12 bd 01 00 00 10
|...w..."V.......|
02c29290 02 c6 07 15 00 22 5e 02 0b 8b 05 00 00 18 02 26
|....."^........&|
And dumping this area of .debug_str shows the name I'd expect (0x23ff94 within
.debug_str is 0x10d8517c)
10d85168 61 73 6b 5f 73 74 72 75 63 74 00 61 72 63 68 5f
|ask_struct.arch_|
10d85178 64 75 70 5f **74 61 73 6b 5f 73 74 72 75 63 74 00 **
|dup_task_struct.|
10d85188 5f 5f 6b 73 79 6d 74 61 62 5f 5f 5f 70 75 74 5f
|__ksymtab___put_|
10d85198 74 61 73 6b 5f 73 74 72 75 63 74 00 5f 5f 6b 73
|task_struct.__ks|
The relocations within .rela.debug_info, however, change the STRP reference for
the "task_struct" DIE to something else:
Relocation section '.rela.debug_info' at offset 0x16081790 contains
12956143 entries:
Offset Info Type Sym. Value Sym. Name +
Addend
000000000d85 002a0000000a R_X86_64_32 0000000000000000 .debug_str +
66d60
Looking at offset 0x66d60 into .debug_str shows the middle of some other random
name (0x66d60 in would be 0x10babf48): "ksymtab_power_supply_get_drvdata" in
this case.
10babf38 76 5f 67 65 74 5f 64 72 76 64 61 74 61 00 5f 5f
|v_get_drvdata.__|
10babf48 6b 73 79 6d 74 61 62 5f 70 6f 77 65 72 5f 73 75
|ksymtab_power_su|
10babf58 70 70 6c 79 5f 67 65 74 5f 64 72 76 64 61 74 61
|pply_get_drvdata|
10babf68 00 5f 5f 6b 73 74 72 74 61 62 5f 70 6f 77 65 72
|.__kstrtab_power|
Have I misunderstood something fundamental here about the relocation data in
.rela.debug_info and its application...? Or is the relocation data in this
.rela.debug_info bad...?
If there is a better mailing list for me to ask such a question, I'd be happy
for a redirect.
Sincerely,
Bill Messmer