rtld: Annotate .rtld_start on i386
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
This commit is contained in:
parent
86c63225ea
commit
e541cf8316
@ -30,8 +30,15 @@
|
|||||||
.globl .rtld_start
|
.globl .rtld_start
|
||||||
.type .rtld_start,@function
|
.type .rtld_start,@function
|
||||||
.rtld_start:
|
.rtld_start:
|
||||||
|
.cfi_startproc
|
||||||
|
.cfi_undefined %eip
|
||||||
xorl %ebp,%ebp # Clear frame pointer for good form
|
xorl %ebp,%ebp # Clear frame pointer for good form
|
||||||
movl %esp,%esi # Save initial stack pointer
|
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
|
andl $0xfffffff0,%esp # Align stack pointer
|
||||||
subl $16,%esp # A place to store exit procedure addr
|
subl $16,%esp # A place to store exit procedure addr
|
||||||
movl %esp,%ebx # save address of exit proc
|
movl %esp,%ebx # save address of exit proc
|
||||||
@ -53,6 +60,7 @@
|
|||||||
.globl .rtld_goto_main
|
.globl .rtld_goto_main
|
||||||
.rtld_goto_main: # This symbol exists just to make debugging easier.
|
.rtld_goto_main: # This symbol exists just to make debugging easier.
|
||||||
jmp *%eax # Enter main program
|
jmp *%eax # Enter main program
|
||||||
|
.cfi_endproc
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user