1998-03-09 23:36  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/init-first.c [!PIC]: Expect arguments
	in correct format.
	* sysdeps/unix/sysv/linux/libc-start.c: Call __libc_init_first
	with correct parameters.
	[!PIC]: Initialize __libc_multiple_libcs.
This commit is contained in:
Ulrich Drepper 1998-03-09 23:40:44 +00:00
parent 0c367d923b
commit 1393c74581
3 changed files with 32 additions and 9 deletions

View File

@ -1,3 +1,11 @@
1998-03-09 23:36 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/init-first.c [!PIC]: Expect arguments
in correct format.
* sysdeps/unix/sysv/linux/libc-start.c: Call __libc_init_first
with correct parameters.
[!PIC]: Initialize __libc_multiple_libcs.
1998-03-09 18:21 Ulrich Drepper <drepper@cygnus.com> 1998-03-09 18:21 Ulrich Drepper <drepper@cygnus.com>
* elf/dl-support.c (_dl_debug_bindings): Add definition. * elf/dl-support.c (_dl_debug_bindings): Add definition.

View File

@ -1,5 +1,5 @@
/* Initialization code run first thing by the ELF startup code. Linux version. /* Initialization code run first thing by the ELF startup code. Linux version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -97,9 +97,11 @@ __libc_init_first (void)
} }
#else #else
void
SYSDEP_CALL_INIT(__libc_init_first, init); __libc_init_first (int argc, char **argv, char **envp)
{
init (argc, argv, envp);
}
#endif #endif

View File

@ -20,26 +20,39 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
extern void __libc_init_first (void); 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;
int int
__libc_start_main (int (*main) (int, char **, char **), int argc, __libc_start_main (int (*main) (int, char **, char **), int argc,
char **argv, void (*init) (void), void (*fini) (void), char **argv, void (*init) (void), void (*fini) (void),
void (*rtld_fini) (void)) void (*rtld_fini) (void))
{ {
#ifndef PIC
/* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
If the address would be taken inside the expression the optimizer
would try to be too smart and throws it away. Grrr. */
int *dummy_addr = &_dl_starting_up;
__libc_multiple_libcs = dummy_addr && !_dl_starting_up;
#endif
/* Register the destructor of the dynamic linker if there is any. */ /* Register the destructor of the dynamic linker if there is any. */
if (rtld_fini != NULL) if (rtld_fini != NULL)
atexit (rtld_fini); atexit (rtld_fini);
/* Set the global _environ variable correctly. */
__environ = &argv[argc + 1];
/* Call the initializer of the libc. */ /* Call the initializer of the libc. */
#ifdef PIC #ifdef PIC
if (_dl_debug_impcalls) if (_dl_debug_impcalls)
_dl_debug_message ("\tinitialize libc\n\n", NULL); _dl_debug_message ("\tinitialize libc\n\n", NULL);
#endif #endif
__libc_init_first (); __libc_init_first (argc, argv, __environ);
/* Set the global _environ variable correctly. */
__environ = &argv[argc + 1];
/* Call the initializer of the program. */ /* Call the initializer of the program. */
#ifdef PIC #ifdef PIC