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