Skip to content

Commit

Permalink
rtld: Annotate .rtld_start on i386
Browse files Browse the repository at this point in the history
Add a stop indicator to rtld_start to satisfy unwinders:
The right unwinding stop indicator should be CFI-undefined PC.
https://dwarfstd.org/doc/Dwarf3.pdf - page 118:
If a Return Address register is defined in the virtual unwind table,
and its rule is undefined (for example, by DW_CFA_undefined), then
there is no return address and no call address, and the virtual
unwind of stack activations is complete.

That is allows gdb and libunwind successfully stop when unwinding stack
from global constructors and destructors.

Reviewed by:		kib
Differential Revision:	https://reviews.freebsd.org/D40949
  • Loading branch information
lemul committed Jul 11, 2023
1 parent 86c6322 commit e541cf8
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions libexec/rtld-elf/i386/rtld_start.S
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,15 @@
.globl .rtld_start
.type .rtld_start,@function
.rtld_start:
.cfi_startproc
.cfi_undefined %eip
xorl %ebp,%ebp # Clear frame pointer for good form
movl %esp,%esi # Save initial stack pointer
pushl %ebp
.cfi_def_cfa_offset 4
movl %esp,%ebp
.cfi_offset %ebp,-4
.cfi_def_cfa_register %ebp
andl $0xfffffff0,%esp # Align stack pointer
subl $16,%esp # A place to store exit procedure addr
movl %esp,%ebx # save address of exit proc
Expand All @@ -53,6 +60,7 @@
.globl .rtld_goto_main
.rtld_goto_main: # This symbol exists just to make debugging easier.
jmp *%eax # Enter main program
.cfi_endproc


/*
Expand Down

0 comments on commit e541cf8

Please sign in to comment.