summary refs log tree commit diff
path: root/csu
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2009-11-30 15:01:58 +0100
committerAndreas Schwab <schwab@redhat.com>2009-11-30 15:01:58 +0100
commit54ff413202df84fc1e90d5299a9eb55f2bf4eb31 (patch)
tree2e5c0006e2aaf0514cf30373e9b3ff1dc0c1fe6b /csu
parentb127b8513f55a7d1a9312f32740914ed764f080c (diff)
parentb55ec98c6490b944593243c7da54dda1796e3f84 (diff)
downloadglibc-54ff413202df84fc1e90d5299a9eb55f2bf4eb31.tar.gz
glibc-54ff413202df84fc1e90d5299a9eb55f2bf4eb31.tar.xz
glibc-54ff413202df84fc1e90d5299a9eb55f2bf4eb31.zip
Merge remote branch 'origin/master' into fedora/master
Diffstat (limited to 'csu')
-rw-r--r--csu/elf-init.c21
-rw-r--r--csu/libc-start.c6
2 files changed, 21 insertions, 6 deletions
diff --git a/csu/elf-init.c b/csu/elf-init.c
index 7481e69aa6..f828faa601 100644
--- a/csu/elf-init.c
+++ b/csu/elf-init.c
@@ -89,15 +89,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
   {
@@ -115,7 +114,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 80b672f88d..dc7ca55f09 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -24,6 +24,9 @@
 #include <bp-sym.h>
 
 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.  */