Add missing unwind information to ld.so on powerpc32 (bug 23707)

This commit is contained in:
Andreas Schwab 2018-09-25 01:22:22 +02:00
parent 61d8b5feee
commit 6ca8284e7a
5 changed files with 86 additions and 2 deletions

View file

@ -1,3 +1,12 @@
2018-09-26 Andreas Schwab <schwab@suse.de>
[BZ #23707]
* sysdeps/powerpc/powerpc32/dl-start.S: Add unwind information.
* elf/Makefile (tests): Add tst-unwind-ctor.
(modules-names): Add tst-unwind-ctor-lib.
($(objpfx)tst-unwind-ctor): Depend on
$(objpfx)tst-unwind-ctor-lib.so.
2018-09-26 Joseph Myers <joseph@codesourcery.com>
* sysdeps/unix/sysv/linux/bits/mman-map-flags-generic.h: New

View file

@ -186,7 +186,8 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
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-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \
tst-unwind-ctor
# reldep9
tests-internal += loadtest unload unload2 circleload1 \
neededtest neededtest2 neededtest3 neededtest4 \
@ -273,7 +274,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \
tst-absolute-zero-lib tst-big-note-lib
tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib
# Most modules build with _ISOMAC defined, but those filtered out
# depend on internal headers.
modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
@ -1492,3 +1493,5 @@ tst-libc_dlvsym-static-ENV = \
$(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

42
elf/tst-unwind-ctor-lib.c Normal file
View file

@ -0,0 +1,42 @@
/* Unit test for _Unwind_Backtrace in a shared object constructor.
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>
static _Unwind_Reason_Code
callback (struct _Unwind_Context *ctx, void *arg)
{
return _URC_NO_REASON;
}
static void
__attribute__ ((constructor))
do_unwind (void)
{
/* Arrange for this test to be killed if _Unwind_Backtrace runs into an
endless loop. We cannot use the test driver since the test needs to
run in a constructor. */
alarm (20);
_Unwind_Backtrace (callback, 0);
}
void
dummy (void)
{
}

27
elf/tst-unwind-ctor.c Normal file
View file

@ -0,0 +1,27 @@
/* Unit test for _Unwind_Backtrace in a shared object constructor.
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/>. */
extern void dummy (void);
int
main (void)
{
/* Just call a dummy function in the shared library. The actual test
runs in its constructor. */
dummy ();
}

View file

@ -34,6 +34,9 @@ ENTRY(_start)
_dl_start to save the link register). */
li r4,0
addi r1,r1,-16
cfi_adjust_cfa_offset (16)
/* Mark lr as undefined to stop unwinding. */
cfi_undefined (lr)
stw r4,0(r1)
bl _dl_start@local