diff options
Diffstat (limited to 'sysdeps/powerpc/elf')
-rw-r--r-- | sysdeps/powerpc/elf/libc-start.c | 23 | ||||
-rw-r--r-- | sysdeps/powerpc/elf/start.S | 11 |
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) |