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
Wed Jan 12 09:31:12 CET 2022


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