binutils-2.39 is out: https://sourceware.org/pipermail/binutils/2022-August/122246.html I tried to package it in nixpkgs and found a few build or test failures. elfutils-0.187 and elfutils from git both fail run-low_high_pc.sh as: FAIL: run-low_high_pc.sh ======================== [b] main.c [2d] main [b] ../sysdeps/i386/start.S [26] _start [40] ../sysdeps/x86/abi-note.c [b52] init.c [b8e] static-reloc.c [2dba] _dl_relocate_static_pie [2dd8] ../sysdeps/i386/crti.S [2def] _init lowpc: 8049000, highpc: 8049000lx ../sysdeps/i386/crti.S: [2def] '_init' highpc <= lowpc FAIL run-low_high_pc.sh (exit status: 255) Extra `lx` prefix looks minor. lowpc == highpc looks real. gdb somehow manages to detect the PC range for _init. Not sure which of tested files is that.
Created attachment 14257 [details] low_high_pc Attaching the binary itself. It was a failing selftest: $ LD_LIBRARY_PATH=$PWD/libdw:$PWD/libelf tests/low_high_pc -e tests/low_high_pc [b] ../sysdeps/i386/start.S [26] _start [40] ../sysdeps/x86/abi-note.c [b52] init.c [b8e] static-reloc.c [2dba] _dl_relocate_static_pie [2dd8] ../sysdeps/i386/crti.S [2def] _init lowpc: 8049000, highpc: 8049000 ../sysdeps/i386/crti.S: [2def] '_init' highpc <= lowpc gdb somehow knows the size of the _init: $ gdb /tmp/low_high_pc Reading symbols from /tmp/low_high_pc... (gdb) disassemble _init Dump of assembler code for function _init: 0x08049000 <+0>: endbr32 0x08049004 <+4>: push %ebx 0x08049005 <+5>: sub $0x8,%esp 0x08049008 <+8>: call 0x8049400 <__x86.get_pc_thunk.bx> 0x0804900d <+13>: add $0x2f93,%ebx 0x08049013 <+19>: mov 0x5c(%ebx),%eax 0x08049019 <+25>: test %eax,%eax 0x0804901b <+27>: je 0x804901f <_init+31> 0x0804901d <+29>: call *%eax 0x0804901f <+31>: add $0x8,%esp 0x08049022 <+34>: pop %ebx 0x08049023 <+35>: ret End of assembler dump.
Could it be that it's a mild `crti.o` corruption by new binutils? "MIPS assembler" does not sound right. ``` $ readelf -aW crti.o --debug-dump ... Contents of the .debug_info section: Compilation Unit @ offset 0x0: Length: 0x49 (32-bit) Version: 2 Abbrev Offset: 0x0 Pointer Size: 4 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) <c> DW_AT_stmt_list : (data4) 0x0 <10> DW_AT_ranges : (data4) 0x0 <14> DW_AT_name : (strp) (offset: 0x0): ../sysdeps/i386/crti.S <18> DW_AT_comp_dir : (strp) (offset: 0x17): /build/glibc-2.35/csu <1c> DW_AT_producer : (strp) (offset: 0x2d): GNU AS 2.39 <20> DW_AT_language : (data2) 32769 (MIPS assembler) <1><22>: Abbrev Number: 2 (DW_TAG_subprogram) <23> DW_AT_name : (strp) (offset: 0x39): _init <27> DW_AT_external : (flag) 1 <28> DW_AT_low_pc : (addr) 0x0 <2c> DW_AT_high_pc : (addr) 0x0 <1><30>: Abbrev Number: 2 (DW_TAG_subprogram) <31> DW_AT_name : (strp) (offset: 0x3f): __x86.get_pc_thunk.bx <35> DW_AT_external : (flag) 1 <36> DW_AT_low_pc : (addr) 0x0 <3a> DW_AT_high_pc : (addr) 0x4 <1><3e>: Abbrev Number: 2 (DW_TAG_subprogram) <3f> DW_AT_name : (strp) (offset: 0x55): _fini <43> DW_AT_external : (flag) 1 <44> DW_AT_low_pc : (addr) 0x0 <48> DW_AT_high_pc : (addr) 0x0 <1><4c>: Abbrev Number: 0 ... ```
gas-2.39 started adding 0-sized DIE for function without a .size marking: $ cat crti.S.S .section .init,"ax",@progbits .p2align 2 .globl _init .hidden _init .type _init, @function _init: .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat .globl __x86.get_pc_thunk.bx .hidden __x86.get_pc_thunk.bx .p2align 4 .type __x86.get_pc_thunk.bx,@function __x86.get_pc_thunk.bx: ud2 .size __x86.get_pc_thunk.bx, . - __x86.get_pc_thunk.bx .previous ud2 $ as-2.39 --gdwarf2 --32 -o crti.o crti.S.S $ readelf -aW --debug-dump crti.o <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) <c> DW_AT_stmt_list : (data4) 0x0 <10> DW_AT_ranges : (data4) 0x0 <14> DW_AT_name : (strp) (offset: 0x0): crti.S.S <18> DW_AT_comp_dir : (strp) (offset: 0x9): /home/slyfox/dev/bugs/binutils-2.39-crti-size/delta <1c> DW_AT_producer : (strp) (offset: 0x3d): GNU AS 2.39 <20> DW_AT_language : (data2) 32769 (MIPS assembler) <1><22>: Abbrev Number: 2 (DW_TAG_subprogram) <23> DW_AT_name : (strp) (offset: 0x49): _init <27> DW_AT_external : (flag) 1 <28> DW_AT_low_pc : (addr) 0x0 <2c> DW_AT_high_pc : (addr) 0x0 <1><30>: Abbrev Number: 2 (DW_TAG_subprogram) <31> DW_AT_name : (strp) (offset: 0x4f): __x86.get_pc_thunk.bx <35> DW_AT_external : (flag) 1 <36> DW_AT_low_pc : (addr) 0x0 <3a> DW_AT_high_pc : (addr) 0x2 <1><3e>: Abbrev Number: 0 $ as-2.38 --gdwarf2 --32 -o crti.o crti.S.S $ readelf -aW --debug-dump crti.o <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit) <c> DW_AT_stmt_list : (data4) 0x0 <10> DW_AT_ranges : (data4) 0x0 <14> DW_AT_name : (strp) (offset: 0x0): crti.S.S <18> DW_AT_comp_dir : (strp) (offset: 0x9): /home/slyfox/dev/bugs/binutils-2.39-crti-size/delta <1c> DW_AT_producer : (strp) (offset: 0x3d): GNU AS 2.38 <20> DW_AT_language : (data2) 32769 (MIPS assembler) Not sure if it's a discrepancy in binutils.
Filed https://sourceware.org/PR29451 against gas.
(In reply to Sergei Trofimovich from comment #4) > Filed https://sourceware.org/PR29451 against gas. Right. I added a comment there. Hopefully it gets fixed in binutils. Because I believe the elfutils testcase is correct. Adding a low_pc/high_pc attribute means you are describing a single continuous address range. You cannot do that by having low_pc == high_pc.
Did the binutils 2.39 commit: commit e8cf73215187b0c08679d726a5cc7c019fa3ea2e Author: Jan Beulich <jbeulich@suse.com> Date: Wed Aug 10 10:34:22 2022 +0200 gas/Dwarf: properly skip zero-size functions Fix this? In that case I suggest we close this bug and recommend people upgrade to binutils 2.39.1 when that gets released
(In reply to Mark Wielaard from comment #6) > Did the binutils 2.39 commit: > > commit e8cf73215187b0c08679d726a5cc7c019fa3ea2e > Author: Jan Beulich <jbeulich@suse.com> > Date: Wed Aug 10 10:34:22 2022 +0200 > > gas/Dwarf: properly skip zero-size functions > > Fix this? Yes.
Yeah. The gas fix fixed elfutils test suite for me. Let's mark it RESOLVED/MOVED.