aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/elf
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/elf')
-rw-r--r--sysdeps/powerpc/elf/libc-start.c23
-rw-r--r--sysdeps/powerpc/elf/start.S11
2 files changed, 26 insertions, 8 deletions
diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c
index 535eab2a64..e90553a154 100644
--- a/sysdeps/powerpc/elf/libc-start.c
+++ b/sysdeps/powerpc/elf/libc-start.c
@@ -25,6 +25,7 @@ extern void __libc_init_first (int argc, char **argv, char **envp);
extern int _dl_starting_up;
weak_extern (_dl_starting_up)
extern int __libc_multiple_libcs;
+extern void *__libc_stack_end;
struct startup_info
{
@@ -67,13 +68,17 @@ __libc_start_main (int argc, char **argv, char **envp,
rtld_fini = NULL;
}
- /* Register the destructor of the dynamic linker if there is any. */
- if (rtld_fini != NULL)
- atexit (rtld_fini);
+ /* Store something that has some relationship to the end of the
+ stack, for backtraces. This variable should be thread-specific. */
+ __libc_stack_end = stack_on_entry + 4;
/* Set the global _environ variable correctly. */
__environ = envp;
+ /* Register the destructor of the dynamic linker if there is any. */
+ if (rtld_fini != NULL)
+ atexit (rtld_fini);
+
/* Call the initializer of the libc. */
#ifdef PIC
if (_dl_debug_impcalls)
@@ -81,15 +86,17 @@ __libc_start_main (int argc, char **argv, char **envp,
#endif
__libc_init_first (argc, argv, envp);
- /* Call the initializer of the program. */
+ /* Register the destructor of the program, if any. */
+ if (stinfo->fini)
+ atexit (stinfo->fini);
+
+ /* Call the initializer of the program, if any. */
#ifdef PIC
if (_dl_debug_impcalls)
_dl_debug_message (1, "\ninitialize program: ", argv[0], "\n\n", NULL);
#endif
- stinfo->init (argc, argv, __environ, auxvec);
-
- /* Register the destructor of the program. */
- atexit (stinfo->fini);
+ if (stinfo->init)
+ stinfo->init (argc, argv, __environ, auxvec);
#ifdef PIC
if (_dl_debug_impcalls)
diff --git a/sysdeps/powerpc/elf/start.S b/sysdeps/powerpc/elf/start.S
index 94cb423629..a52ac8b64d 100644
--- a/sysdeps/powerpc/elf/start.S
+++ b/sysdeps/powerpc/elf/start.S
@@ -7,6 +7,15 @@
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
+ In addition to the permissions in the GNU Library General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The Library General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
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
@@ -22,6 +31,8 @@
/* These are the various addresses we require. */
.section ".rodata"
.align 2
+ weak_extern(_init)
+ weak_extern(_fini)
L(start_addresses):
.long _SDA_BASE_
.long JUMPTARGET(main)