RISC-V: properly terminate call chain (bug 23125)
Mark the ra register as undefined in _start, so that unwinding through main works correctly. Also, don't use a tail call so that ra points after the call to __libc_start_main, not after the previous call.
This commit is contained in:
parent
fec8bb7ca9
commit
2dd12baa04
@ -1,3 +1,12 @@
|
||||
2018-10-30 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
[BZ #23125]
|
||||
* sysdeps/riscv/start.S (ENTRY_POINT): Mark ra as undefined.
|
||||
Don't use tail call.
|
||||
* elf/tst-unwind-main.c: New file.
|
||||
* elf/Makefile (tests): Add tst-unwind-main.
|
||||
(CFLAGS-tst-unwind-main.c): Define.
|
||||
|
||||
2018-10-29 Sergi Almacellas Abellana <sergi@koolpi.com>
|
||||
|
||||
[BZ #23791]
|
||||
|
@ -187,7 +187,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \
|
||||
tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \
|
||||
tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \
|
||||
tst-unwind-ctor
|
||||
tst-unwind-ctor tst-unwind-main
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@ -1495,3 +1495,5 @@ $(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
|
||||
$(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so
|
||||
|
||||
$(objpfx)tst-unwind-ctor: $(objpfx)tst-unwind-ctor-lib.so
|
||||
|
||||
CFLAGS-tst-unwind-main.c += -funwind-tables
|
||||
|
38
elf/tst-unwind-main.c
Normal file
38
elf/tst-unwind-main.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Test unwinding through main.
|
||||
Copyright (C) 2018 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <unwind.h>
|
||||
#include <unistd.h>
|
||||
#include <support/test-driver.h>
|
||||
|
||||
static _Unwind_Reason_Code
|
||||
callback (struct _Unwind_Context *ctx, void *arg)
|
||||
{
|
||||
return _URC_NO_REASON;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
/* Arrange for this test to be killed if _Unwind_Backtrace runs into an
|
||||
endless loop. We cannot use the test driver because the complete
|
||||
call chain needs to be compiled with -funwind-tables so that
|
||||
_Unwind_Backtrace is able to reach _start. */
|
||||
alarm (DEFAULT_TIMEOUT);
|
||||
_Unwind_Backtrace (callback, 0);
|
||||
}
|
@ -43,6 +43,10 @@
|
||||
__libc_start_main wants this in a5. */
|
||||
|
||||
ENTRY (ENTRY_POINT)
|
||||
/* Terminate call stack by noting ra is undefined. Use a dummy
|
||||
.cfi_label to force starting the FDE. */
|
||||
.cfi_label .Ldummy
|
||||
cfi_undefined (ra)
|
||||
call .Lload_gp
|
||||
mv a5, a0 /* rtld_fini. */
|
||||
/* main may be in a shared library. */
|
||||
@ -54,7 +58,8 @@ ENTRY (ENTRY_POINT)
|
||||
lla a4, __libc_csu_fini
|
||||
mv a6, sp /* stack_end. */
|
||||
|
||||
tail __libc_start_main@plt
|
||||
call __libc_start_main@plt
|
||||
ebreak
|
||||
END (ENTRY_POINT)
|
||||
|
||||
/* Dynamic links need the global pointer to be initialized prior to calling
|
||||
|
Loading…
Reference in New Issue
Block a user