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:
parent
ee5a5ba672
commit
1c3c269b55
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
Loading…
Reference in New Issue