about summary refs log tree commit diff
path: root/elf/dl-init.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-03-31 07:14:42 +0000
committerUlrich Drepper <drepper@redhat.com>2000-03-31 07:14:42 +0000
commitd7926ed9feaea00e348acc7230156e39d8511498 (patch)
treedc6ad9e11d5bbde8d366caa53416bc39c6dd8dd3 /elf/dl-init.c
parent924c3f59722cb33c27537e922f31bf5413cd97fc (diff)
downloadglibc-d7926ed9feaea00e348acc7230156e39d8511498.tar.gz
glibc-d7926ed9feaea00e348acc7230156e39d8511498.tar.xz
glibc-d7926ed9feaea00e348acc7230156e39d8511498.zip
Update.
	* elf/Makefile (dl-routines): Remove preinit.
	* elf/Versions: Remove _dl_preinit.
	* elf/dl-preinit.c: Removed.  Move content into...
	* elf/dl-init.c: ...here.
Diffstat (limited to 'elf/dl-init.c')
-rw-r--r--elf/dl-init.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/elf/dl-init.c b/elf/dl-init.c
index c20e87a14a..2c1c24ca54 100644
--- a/elf/dl-init.c
+++ b/elf/dl-init.c
@@ -29,9 +29,28 @@ void
 internal_function
 _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
 {
+  ElfW(Dyn) *preinit_array = main_map->l_info[DT_PREINIT_ARRAYSZ];
   struct r_debug *r;
   unsigned int i;
 
+  /* Don't do anything if there is no preinit array.  */
+  if (preinit_array != NULL
+      && (i = preinit_array->d_un.d_val / sizeof (ElfW(Addr))) > 0)
+    {
+      ElfW(Addr) *addrs;
+      unsigned int cnt;
+
+      if (_dl_debug_impcalls)
+	_dl_debug_message (1, "\ncalling preinit: ",
+			   main_map->l_name[0]
+			   ? main_map->l_name : _dl_argv[0], "\n\n", NULL);
+
+      addrs = (ElfW(Addr) *) (main_map->l_info[DT_PREINIT_ARRAY]->d_un.d_ptr
+			      + main_map->l_addr);
+      for (cnt = 0; cnt < i; ++cnt)
+	((init_t) addrs[cnt]) (argc, argv, env);
+    }
+
   /* Notify the debugger we have added some objects.  We need to call
      _dl_debug_initialize in a static program in case dynamic linking has
      not been used before.  */