Fix startup to security-relevant statically linked binaries.

Before the change they crash on startup.  Perform IREL relocations
earlier to prevent this.
This commit is contained in:
Ulrich Drepper 2009-11-24 11:17:06 -08:00
parent ee5a5ba672
commit 1c3c269b55
3 changed files with 28 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2009-11-24 Ulrich Drepper <drepper@redhat.com>
* csu/elf-init.c (__libc_csu_irel): New function. Code to perform
irel relocations split out from...
(__libc_csu_init): ...here.
* csu/libc-start.c [!SHARED]: Call __libc_csu_irel early.
2009-11-23 Andreas Schwab <schwab@redhat.com> 2009-11-23 Andreas Schwab <schwab@redhat.com>
* sysdeps/unix/sysv/linux/x86_64/bits/stat.h: Use struct timespec * sysdeps/unix/sysv/linux/x86_64/bits/stat.h: Use struct timespec

View File

@ -72,15 +72,14 @@ extern void _fini (void);
/* These functions are passed to __libc_start_main by the startup code. /* These functions are passed to __libc_start_main by the startup code.
These get statically linked into each program. For dynamically linked These get statically linked into each program. For dynamically linked
programs, this module will come from libc_nonshared.a and differs from programs, this module will come from libc_nonshared.a and differs from
the libc.a module in that it doesn't call the preinit array. */ the libc.a module in that it doesn't call the preinit array and performs
explicit IREL{,A} relocations. */
void
__libc_csu_init (int argc, char **argv, char **envp)
{
/* For dynamically linked executables the preinit array is executed by
the dynamic linker (before initializing any shared object. */
#ifndef LIBC_NONSHARED #ifndef LIBC_NONSHARED
void
__libc_csu_irel (void)
{
# ifdef USE_MULTIARCH # ifdef USE_MULTIARCH
# ifdef ELF_MACHINE_IRELA # ifdef ELF_MACHINE_IRELA
{ {
@ -98,7 +97,17 @@ __libc_csu_init (int argc, char **argv, char **envp)
} }
# endif # endif
# endif # endif
}
#endif
void
__libc_csu_init (int argc, char **argv, char **envp)
{
/* For dynamically linked executables the preinit array is executed by
the dynamic linker (before initializing any shared object. */
#ifndef LIBC_NONSHARED
/* For static executables, preinit happens right before init. */ /* For static executables, preinit happens right before init. */
{ {
const size_t size = __preinit_array_end - __preinit_array_start; const size_t size = __preinit_array_end - __preinit_array_start;

View File

@ -24,6 +24,9 @@
#include <bp-sym.h> #include <bp-sym.h>
extern void __libc_init_first (int argc, char **argv, char **envp); extern void __libc_init_first (int argc, char **argv, char **envp);
#ifndef SHARED
extern void __libc_csu_irel (void);
#endif
extern int __libc_multiple_libcs; extern int __libc_multiple_libcs;
@ -134,6 +137,9 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
} }
# endif # endif
/* Performe IREL{,A} relocations. */
__libc_csu_irel ();
/* Initialize the thread library at least a bit since the libgcc /* Initialize the thread library at least a bit since the libgcc
functions are using thread functions if these are available and functions are using thread functions if these are available and
we need to setup errno. */ we need to setup errno. */