How to use add-symbol-file in gdb after the program jumped to linux? (both when PC is physical and virtual)

Chan Kim ckim at etri.re.kr
Thu Jan 13 10:41:28 CET 2022


I found my kernel load address was wrong (__PHYS_OFFSET was below physical
ddr address start).
After fixing it the PC increments normally with kernel virtual address and I
should just apply the add-symbol-file command using the virtual address.
With this command(with new kernel image), I could follow the source using
qemu and gdb step-by-step after __primary_switched.
add-symbol-file images/vmlinux 0xffffffc010080800 -s .head.text
0xffffffc010080000 -s .init.text 0xffffffc010470000
Hope this helps someone later.
Thanks!
Chan Kim


> -----Original Message-----
> From: Chan Kim <ckim at etri.re.kr>
> Sent: Wednesday, January 12, 2022 5:31 PM
> To: 'U-Boot Mailing List' <u-boot at lists.denx.de>
> Subject: RE: How to use add-symbol-file in gdb after the program jumped to
> linux? (both when PC is physical and virtual)
> 
> I found from gdb manual,
> 
> "add-symbol-file filename [ -readnow | -readnever ] [ -o offset ]
> [ textaddress ] [ -s section address ... ] The add-symbol-file command
> reads additional symbol table information from the file filename. You
> would use this command when filename has been dynamically loaded (by some
> other means) into the program that is running.
> The textaddress parameter gives the memory address at which the file's
> text section has been loaded. You can additionally specify the base
> address of other sections using an arbitrary number of '-s section
address'
> pairs. If a section is omitted, gdb will use its default addresses as
> found in filename. Any address or textaddress can be given as an
> expression. ..."
> 
> I changed my program a little bit to fix a problem. The readelf shows
> the .text section starting at ffffffc010080800.
> So I adjusted the command to "add-symbol-file vmlinux 0x80000800" and gdb
> shows the kernel source correct after jump to linux.
> Still it doesn't show me the source code after __primary_switched.
> 
> Section Headers:
>   [Nr] Name              Type             Address           Offset
>        Size              EntSize          Flags  Link  Info  Align
>   [ 0]                   NULL             0000000000000000  00000000
>        0000000000000000  0000000000000000           0     0     0
>   [ 1] .head.text        PROGBITS         ffffffc010080000  00010000
>        0000000000000040  0000000000000000  AX       0     0     4
>   [ 2] .text             PROGBITS         ffffffc010080800  00010800
>        0000000000304370  0000000000000000  AX       0     0     2048
>   [ 3] .rodata           PROGBITS         ffffffc010390000  00320000
>    .... (skip) ...
>   [12] .notes            NOTE             ffffffc01045be18  003ebe18
>        000000000000003c  0000000000000000   A       0     0     4
>   [13] .init.text        PROGBITS         ffffffc010470000  003f0000
>        0000000000027ec8  0000000000000000  AX       0     0     4
>   [14] .exit.text        PROGBITS         ffffffc010497ec8  00417ec8
>        000000000000046c  0000000000000000  AX       0     0     4
> 
> Since '__primary_switched' resides in section .init.text, I tried adding
> "-s .init.text 0xffffffc010470000" or "-s .init_text 0x803ef800"(physcial
> address) to the add-symbol-file command to no avail. Is my command wrong?
> Or could this be from page table (virtual -> Physical) problem because I
> see synchronous exception right after I enter __primary_switched (I see PC
> value has become 0x200. If the exception vector is located in 0x0, this is
> the vector entry for synch exception like undefined instruction. I should
> also check the vector base address has not been set correctly.)
> 
> Any comment or advice will be deeply appreciated.
> Thank you!
> 
> Chan Kim
> 
> > -----Original Message-----
> > From: U-Boot <u-boot-bounces at lists.denx.de> On Behalf Of Chan Kim
> > Sent: Wednesday, January 12, 2022 4:43 PM
> > To: U-Boot Mailing List <u-boot at lists.denx.de>
> > Subject: How to use add-symbol-file in gdb after the program jumped to
> > linux? (both when PC is physical and virtual)
> >
> > Hello experts,
> >
> >
> >
> > I'm following linux boot-loading using u-boot (using SPL falcon mode,
> > from
> > RAM) on a qemu virtual machine (now linux started in real board too).
> > The code jumped to linux kernel and because I have done
> > `add-symbol-file vmlinux 0x80081000` I can follow the kernel code step
> > by step using gdb connected to the virtual machine. Actually I loaded
> > the kernel image to
> > 0x80080000 but I had to set the address to 0x80081000 to make the
> > source code appear on the gdb correctly according to the PC value(I
> > don't know why this difference of
> > 0x1000 is needed).
> >
> > Later I found the kernel sets up the page table (identity mapping and
> > swap
> > table) and jumps to `__primary_switched` and this is where pure kernel
> > virtual address is used first time for the PC. This is where the call
> > is made at the end of the head.S file.
> >
> >
> >
> >     ldr x8, =__primary_switched
> >
> >     adrp    x0, __PHYS_OFFSET
> >
> >     br  x8
> >
> >
> >
> > In the symbol file (vmlinux, an elf file), the symbols before
> > __primary_switched are all mapped at virtual addresses (starting with
> > 0xffffffc0..... high addresses) but the gdb could follow the source
> > even when the PC value was using physical address. (The PC was
> > initially loaded with physical address of the kernel start and PC
> > relative jumps were being used until it jumps to `__primary_switched`,
> > mmu disabled or using identity
> > mapping) So does this mean, in doing `add-symbol-file` only the offset
> > of the symbols from the start of text matters?
> >
> > Another question : I can follow the kernel source with gdb but after
> > __primary_switched, I cannot see the source. The debugger doesn't show
> > the correct source location according to the now kernel virtual PC
value.
> > Should I tell the debugger to use correct offset using add-symbol-file
> > again? if so how?
> >
> >
> >
> > I would be happy to hear any comment or advice.
> >
> > Thank you!
> >
> >
> >
> > Chan Kim
> >
> >
> >






More information about the U-Boot mailing list