Re: Fwd: RISC-V bare-metal: GDB loses source line info when .text starts at 0x0

Andrew Burgess via Gdb <[email protected]> Sat, 11 Jul 2026 14:30:14 +0100
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
Andrew Burgess <[email protected]> writes:

> Andrew Burgess <[email protected]> writes:
>
>> Zhao Yiming via Gdb <[email protected]> writes:
>>
>>> Hi GDB maintainers,
>>>
>>> I am seeing a possible GDB source-line lookup issue while remote-debugging a
>>> bare-metal RISC-V ELF.
>>>
>>> Environment:
>>> - GDB: 15.2.90.20241210-git, Xuantie-900 elf newlib gcc Toolchain V3.2.0
>>> B-20250627
>>> - GCC: 14.1.1 20240710, same Xuantie toolchain
>>> - ld: GNU ld 2.42.50
>>> - QEMU: qemu-system-riscv64 8.2.94 (cskysim V5.2.8 B-20250721)
>>> - Host: Windows 10.0.19045.6466
>>>
>>> Build flags:
>>>
>>>   -O0 -g -ffunction-sections -fdata-sections -Wl,--gc-sections
>>>
>>> The failing ELF is linked as a bare-metal image with .text VMA = 0x0.
>>>
>>> Reproducer outline:
>>>
>>>   target remote :1234
>>>   load
>>>   b main
>>>   c
>>>   s
>>>   s
>>>   n
>>>   n
>>>   n
>>>   n
>>>
>>> After stepping out of SPI_ModifyGlobalReg(), GDB prints only:
>>>
>>>   0x00000000000002dc in I2C_PinMuxSetup ()
>>>
>>> Expected:
>>>
>>>   I2C_PinMuxSetup (...) at ../src/demoI2c.c:36
>>>
>>> The line information appears to exist:
>>>
>>>   addr2line -e LRV4201_SPI_I2C_2.elf 0x2dc
>>>   -> ../src/demoI2c.c:36
>>>
>>> Relevant symbols:
>>>
>>>   0000000000000000 T Reset_Handler
>>>   00000000000002ca T I2C_PinMuxSetup
>>>   0000000000000920 T SPI_ModifyGlobalReg
>>>
>>> Additional observations:
>>>
>>> 1. If the linker script changes .text from 0x0 to a non-zero address, the
>>>    GDB problem disappears.
>>> 2. If .text still starts at 0x0 but Reset_Handler is placed in .text instead
>>>    of .text.init, the problem also disappears.
>>> 3. The failing ELF contains many zero-address decoded line-table rows from
>>>    demoI2c.c/demoSpi.c. A no-gc build and a reduced working project do not.
>>>
>>> I attached a small archive with decoded line tables, objdump section
>>> headers,
>>> addr2line output, build flags, linker script, and relevant sources. The full
>>> ELFs are not attached because of the mailing list size limit, but I can
>>> provide
>>> them or file a Bugzilla issue if preferred.
>>>
>>
>> If you could file a bugzilla, include this description, and attach
>> everything including the ELFs, that would make things easier.  If you
>> post the link I'll try to take a look when I have time.
>>
>> I'm not surprised that there are issues here, some of the older GDB code
>> still makes use of 0 as a "magic" flag indicating no-data, etc.  I've
>> worked on targets that allow code to be placed at address 0, and fixed
>> some of these issues in the past, so it would be nice to fix this one
>> too.
>
> I took a look into this and opened this bug:
>
>   https://sourceware.org/bugzilla/show_bug.cgi?id=34389
>
> The problem originates from the linker's function garbage collection
> (IMHO).
>
> Garbage collection deletes the function sections, but doesn't
> (unfortunately) try to patch up any of the DWARF.  As a result things
> like `.debug_rnglists` which point at a deleted function are left with a
> start address of 0, the range of the deleted function is effectively
> moved to start at address zero.
>
> The `.debug_rnglists` is then used by GDB when building the address map
> for its compunit_symtab objects (effectively a DWARF compilation unit).
>
> These compunit_symtab are expanded lazily depending on the order in
> which you make use of them, so if you first visit a compunit_symtab
> which contains a garbage collected function then this compunit_symtab
> will always be the first that GDB checks when looking for an address.
> The garbage collected function, with its range starting at 0, in effect
> "claims" that range of addresses.
>
> There are some heuristics in GDB to try and spot garbage collection and
> try to fix up some of the confusing incoming data, but it's not perfect,
> and clearly in this case, it isn't sufficient.
>
> I don't have a plan for fixing this in GDB right now.

OK, actually, I did have one idea.  If you feel like compiling GDB, I
attached a patch to the bug report which resolves the simple reproducer
I create for the bug.  It would be great to know if this also resolves
your original issue or not.

If it does then I will write a proper commit message for the patch and
post it to the mailing list.

Thanks,
Andrew