From: Ulrich Drepper Date: Tue, 24 Nov 2009 19:17:06 +0000 (-0800) Subject: Fix startup to security-relevant statically linked binaries. X-Git-Tag: upstream/2.30~13170 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1c3c269b55c84c29ec1e2c70f122c5e33fef4257;p=external%2Fglibc.git Fix startup to security-relevant statically linked binaries. Before the change they crash on startup. Perform IREL relocations earlier to prevent this. --- diff --git a/ChangeLog b/ChangeLog index 3d22169..dd68e5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-11-24 Ulrich Drepper + + * 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 * sysdeps/unix/sysv/linux/x86_64/bits/stat.h: Use struct timespec diff --git a/csu/elf-init.c b/csu/elf-init.c index 1d2df62..1e3d6d6 100644 --- a/csu/elf-init.c +++ b/csu/elf-init.c @@ -72,15 +72,14 @@ extern void _fini (void); /* These functions are passed to __libc_start_main by the startup code. These get statically linked into each program. For dynamically linked 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 +void +__libc_csu_irel (void) +{ # ifdef USE_MULTIARCH # ifdef ELF_MACHINE_IRELA { @@ -98,7 +97,17 @@ __libc_csu_init (int argc, char **argv, char **envp) } # 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. */ { const size_t size = __preinit_array_end - __preinit_array_start; diff --git a/csu/libc-start.c b/csu/libc-start.c index 80b672f..dc7ca55 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -24,6 +24,9 @@ #include 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; @@ -134,6 +137,9 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), } # endif + /* Performe IREL{,A} relocations. */ + __libc_csu_irel (); + /* Initialize the thread library at least a bit since the libgcc functions are using thread functions if these are available and we need to setup errno. */