Add rtld_db_preinit, rtld_db_postinit, rtld_db_dlactivity
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Fri, 12 Sep 2008 17:36:52 +0000 (17:36 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Fri, 12 Sep 2008 17:36:52 +0000 (17:36 +0000)
NOTES.opensolaris
TODO.opensolaris
elf/dl-debug.c
elf/dl-init.c
elf/dl-rtld_db.h [new file with mode: 0644]
rtld_db/Versions
rtld_db/rd_reset.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/ldsodefs.h

index 75536d5..9a420f1 100644 (file)
@@ -23,6 +23,13 @@ scheduling:
   a class id with a posix scheduler (i.e. SCHED_*). The only exception is
   SCHED_SYS, which is guaranteed to have cid == 0.
 
+privileges:
+
+  Each process has a set of privileges, represented by a prpriv_t. This struct
+  contains a header, followed by a number of priv_chunk_t blocks (the priv
+  sets), and finally followed by a number of priv_info_t blocks (per process
+  additional info).
+
 threads:
 
   The sun libpthread/libthread implementation assumes a 1:1 mapping between
index 0839298..311b042 100644 (file)
@@ -22,6 +22,8 @@ These are solaris extensions that we should implement:
   gethomelgroup
   atomic_*
   membar_*
+  defopen, defread
+  _ttyname_dev
 
 Insert into headers:
   resolvpath (unistd.h)
@@ -31,6 +33,7 @@ Insert into headers:
   uucopy, uucopystr (string.h or strings.h)
   sysi86 (sys/sysi86.h - see below)
   str2sig, sig2str (signal.h)
+  getexecname (stdlib.h)
 
 INVALID_NOT_TERMINATED_TD_P expects to succeed on terminated threads
 
@@ -57,6 +60,21 @@ List of CDDL headers needed to compile random stuff:
   netconfig.h [libnsl]
   sys/netconfig.h [libnsl]
   netdir.h [libnsl]
+  libuutil.h [libuutil]
+  libuutil_impl.h [libuutil]
+  sys/avl.h [libavl]
+  sys/avl_impl.h [libavl]
+  auth_attr.h [libsecdb]
+  user_attr.h [libsecdb]
+  prof_attr.h [libsecdb]
+  secdb.h [libsecdb]
+  libnvpair.h [libnvpair]
+  sys/nvpair.h [libnvpair]
+  sys/nvpair_impl.h [libnvpair]
+  project.h [libproject]
+  sys/aio.h
+  sys/aio_impl.h
+
 Use cond_t data field for broadcast seqence
 
 Use timer_* syscalls
index 2538364..5e11cb5 100644 (file)
@@ -19,6 +19,9 @@
    02111-1307 USA.  */
 
 #include <ldsodefs.h>
+#ifdef ENABLE_RTLD_DB
+# include "dl-rtld_db.h"
+#endif
 
 
 /* These are the members in the public `struct link_map' type.
@@ -76,3 +79,20 @@ _dl_debug_state (void)
 {
 }
 rtld_hidden_def (_dl_debug_state)
+
+#ifdef ENABLE_RTLD_DB
+void
+rtld_db_preinit (void *arg)
+{
+}
+
+void
+rtld_db_postinit (void *arg)
+{
+}
+
+void
+rtld_db_ldactivity (void *arg)
+{
+}
+#endif
index e7b6757..b14b333 100644 (file)
@@ -19,6 +19,9 @@
 
 #include <stddef.h>
 #include <ldsodefs.h>
+#ifdef ENABLE_RTLD_DB
+# include "dl-rtld_db.h"
+#endif
 
 
 /* Type of the initializer.  */
@@ -95,6 +98,10 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
   ElfW(Dyn) *preinit_array_size = main_map->l_info[DT_PREINIT_ARRAYSZ];
   unsigned int i;
 
+#ifdef ENABLE_RTLD_DB
+  rtld_db_preinit (NULL);
+#endif
+
   if (__builtin_expect (GL(dl_initfirst) != NULL, 0))
     {
       call_init (GL(dl_initfirst), argc, argv, env);
@@ -133,6 +140,10 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
   while (i-- > 0)
     call_init (main_map->l_initfini[i], argc, argv, env);
 
+#ifdef ENABLE_RTLD_DB
+  rtld_db_postinit (NULL);
+#endif
+
 #ifndef HAVE_INLINED_SYSCALLS
   /* Finished starting up.  */
   INTUSE(_dl_starting_up) = 0;
diff --git a/elf/dl-rtld_db.h b/elf/dl-rtld_db.h
new file mode 100644 (file)
index 0000000..30df90e
--- /dev/null
@@ -0,0 +1,22 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+extern void rtld_db_preinit (void *arg);
+extern void rtld_db_postinit (void *arg);
+extern void rtld_db_ldactivity (void *arg);
index da66fad..9280c6d 100644 (file)
@@ -5,3 +5,8 @@ librtld_db {
     rd_plt_resolution; rd_reset;
   }
 }
+ld {
+  GLIBC_2.7 {
+    rtld_db_preinit; rtld_db_postinit; rtld_db_dlactivity;
+  }
+}
index a1b555b..3c68337 100644 (file)
@@ -38,5 +38,8 @@ rd_err_e rd_reset (struct rd_agent *rdap)
       return res;
     }
 
+  /* TODO: lookup symbol for rtld_db_preinit, rtld_db_postinit,
+     rtld_db_dlactivity.  */
+
   return RD_OK;
 }
index 29323b0..e5136ce 100644 (file)
@@ -40,4 +40,7 @@ extern const char * _dl_sun_execname;
 /* Initialization which is normally done by the dynamic linker.  */
 extern void _dl_non_dynamic_init (void) internal_function;
 
+/* We want to enable th rtld_db hooks.  */
+#define ENABLE_RTLD_DB
+
 #endif /* ldsodefs.h */