https://sourceware.org/bugzilla/show_bug.cgi?id=32809
Bug ID: 32809 Summary: readelf doesn't dump .debug_loclists section correctly for 64-bit target and mixed dwarf4/5 content Product: binutils Version: 2.45 (HEAD) Status: UNCONFIRMED Severity: normal Priority: P2 Component: binutils Assignee: unassigned at sourceware dot org Reporter: lynda.rowe at ericsson dot com Target Milestone: --- Readelf seems to get stuck in an infinite loop or erroneously dumps too much content for .debug_loclists section when a mix of dwarf4 and dwarf5 is used on x86 64-bit. An example that demonstrates this is: dwarf4.c: extern void bar(); void foo(int p) { int local = p; bar(); local = 123; bar(); local = 456; } dwarf5.c: extern void foo(int); void bar() { } int global; int main() { int local = global; foo(1); local = 123; foo(2); local = 456; return 0; } Building this on: $ lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: RedHatEnterprise Description: Red Hat Enterprise Linux release 8.10 (Ootpa) Release: 8.10 Codename: Ootpa With clang: $ clang --version clang version 20.1.0 Target: x86_64-unknown-linux-gnu Thread model: posix Build config: +assertions rm -f dwarf4.o dwarf5.o && clang -c -g -O1 -gdwarf-4 -o dwarf4.o dwarf4.c && clang -c -g -O1 -gdwarf-5 -o dwarf5.o dwarf5.c && clang dwarf4.o dwarf5.o -o a.out I built binutils on the following commit: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=dad0da34b7c71dbf504058ced12d87d226b2b1b6 using: $ gcc --version gcc (GCC) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ ld --version GNU ld (GNU Binutils) 2.43 Copyright (C) 2024 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. I got: $ ../build2/x86/binutils/readelf -W -wo a.out Contents of the .debug_loc section: Offset Begin End Expression 00000000 0000000000001130 0000000000001138 (DW_OP_reg5 (rdi)) 00000013 0000000000001138 0000000000001140 (DW_OP_GNU_entry_value: (DW_OP_reg5 (rdi)); DW_OP_stack_value) 00000029 <End of list> 00000039 0000000000001131 0000000000001138 (DW_OP_reg5 (rdi)) 0000004c 0000000000001138 0000000000001140 (DW_OP_consts: 123; DW_OP_stack_value) 00000062 <End of list> Table at Offset 0 Length: 0 DWARF version: 0 Address size: 0 Segment size: 0 Offset entries: 8 Offset Entries starting at 0xc: [ 0] 0 [ 1] 0x8550001 [ 2] 0 [ 3] 0x10000000 [ 4] 0 [ 5] 0x4000000 [ 6] 0x5501f300 [ 7] 0x9f Table at Offset 0x4 Length: 0 DWARF version: 8 Address size: 0 Segment size: 0 Offset entries: 0 Table at Offset 0x8 Length: 0x8 DWARF version: 0 Address size: 0 Segment size: 0 Offset entries: 139788289 Offset Entries starting at 0x14: [ 0] 0 [ 1] 0x10000000 [ 2] 0 [ 3] 0x4000000 [ 4] 0x5501f300 and this last part keeps on going for quite a while until I finally hit ctrl+C to stop. The same sort of output exists as near as I can tell as far back as maybe binutils/2.43... I also find that the header information here looks very suspicious when compared to that provided by llvm-dwarfdump associated with the same clang 20.1.0 release: $ llvm-dwarfdump --debug-loc --debug-loclists a.out a.out: file format elf64-x86-64 .debug_loc contents: 0x00000000: (0x0000000000000000, 0x0000000000000008): DW_OP_reg5 RDI (0x0000000000000008, 0x0000000000000010): DW_OP_GNU_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value 0x00000039: (0x0000000000000001, 0x0000000000000008): DW_OP_reg5 RDI (0x0000000000000008, 0x0000000000000010): DW_OP_consts +123, DW_OP_stack_value .debug_loclists contents: locations list header: length = 0x0000001d, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000001 offsets: [ 0x00000004 ] 0x00000010: DW_LLE_offset_pair (0x000000000000001b, 0x0000000000000025): DW_OP_consts +123, DW_OP_stack_value DW_LLE_offset_pair (0x0000000000000025, 0x0000000000000029): DW_OP_consts +456, DW_OP_stack_value Something seems more than a little off about that header information too. -- You are receiving this mail because: You are on the CC list for the bug.