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:
Andreas Schwab 2018-09-25 11:11:27 +02:00
parent fec8bb7ca9
commit 2dd12baa04
4 changed files with 56 additions and 2 deletions

View File

@ -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]

View File

@ -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
View 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);
}

View File

@ -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