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