fgetws implementation.
[kopensolaris-gnu/glibc.git] / elf / ldsodefs.h
index 6814f25..f8db76c 100644 (file)
@@ -1,5 +1,5 @@
 /* Run-time dynamic linker data structures for loaded ELF shared objects.
-   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -148,7 +148,7 @@ extern unsigned long int _dl_hwcap;
 /* Mask for important hardware capabilities we honour. */
 extern unsigned long int _dl_hwcap_mask;
 
-/* File deccriptor to write debug messages to.  */
+/* File descriptor to write debug messages to.  */
 extern int _dl_debug_fd;
 
 /* Names of shared object for which the RPATH should be ignored.  */
@@ -166,7 +166,7 @@ extern void _dl_sysdep_output (int fd, const char *string, ...);
    descriptor for this.  All arguments are `const char *'; args until
    a null pointer are concatenated to form the message to print.  If
    NEW_LINE is nonzero it is assumed that the message starts on a new
-   line.*/
+   line.  */
 extern void _dl_debug_message (int new_line, const char *string, ...);
 
 /* OS-dependent function to write a message on the standard output.
@@ -205,6 +205,14 @@ extern int _dl_secure;
 extern void _dl_signal_error (int errcode,
                              const char *object,
                              const char *errstring)
+     internal_function
+     __attribute__ ((__noreturn__));
+
+/* Like _dl_signal_error, but may return when called in the context of
+   _dl_receive_error.  */
+extern void _dl_signal_cerror (int errcode,
+                              const char *object,
+                              const char *errstring)
      internal_function;
 
 /* Call OPERATE, catching errors from `dl_signal_error'.  If there is no
@@ -218,7 +226,7 @@ extern int _dl_catch_error (char **errstring,
                            void *args)
      internal_function;
 
-/* Call OPERATE, receiving errors from `dl_signal_error'.  Unlike
+/* Call OPERATE, receiving errors from `dl_signal_cerror'.  Unlike
    `_dl_catch_error' the operation is resumed after the OPERATE
    function returns.
    ARGS is passed as argument to OPERATE.  */
@@ -249,9 +257,10 @@ extern struct link_map *_dl_map_object (struct link_map *loader,
    MAP->l_searchlist.  PRELOADS points to a vector of NPRELOADS previously
    loaded objects that will be inserted into MAP->l_searchlist after MAP
    but before its dependencies.  */
-extern void _dl_map_object_deps (struct link_map *map,
-                                struct link_map **preloads,
-                                unsigned int npreloads, int trace_mode)
+extern unsigned int _dl_map_object_deps (struct link_map *map,
+                                        struct link_map **preloads,
+                                        unsigned int npreloads,
+                                        int trace_mode, int global_scope)
      internal_function;
 
 /* Cache the locations of MAP's hash table.  */
@@ -261,7 +270,8 @@ extern void _dl_setup_hash (struct link_map *map) internal_function;
 /* Open the shared object NAME, relocate it, and run its initializer if it
    hasn't already been run.  MODE is as for `dlopen' (see <dlfcn.h>).  If
    the object is already opened, returns its existing map.  */
-extern struct link_map *_dl_open (const char *name, int mode)
+extern struct link_map *_dl_open (const char *name, int mode,
+                                 const void *caller)
      internal_function;
 
 /* Close an object previously opened by _dl_open.  */
@@ -282,7 +292,7 @@ extern void _dl_close (struct link_map *map)
    symbols can be chosen.  */
 extern ElfW(Addr) _dl_lookup_symbol (const char *undef,
                                     const ElfW(Sym) **sym,
-                                    struct link_map *symbol_scope[],
+                                    struct r_scope_elem *symbol_scope[],
                                     const char *reference_name,
                                     int reloc_type)
      internal_function;
@@ -290,7 +300,7 @@ extern ElfW(Addr) _dl_lookup_symbol (const char *undef,
 /* Lookup versioned symbol.  */
 extern ElfW(Addr) _dl_lookup_versioned_symbol (const char *undef,
                                               const ElfW(Sym) **sym,
-                                              struct link_map *symbol_scope[],
+                                              struct r_scope_elem *symbol_scope[],
                                               const char *reference_name,
                                               const struct r_found_version *version,
                                               int reloc_type)
@@ -299,7 +309,7 @@ extern ElfW(Addr) _dl_lookup_versioned_symbol (const char *undef,
 /* For handling RTLD_NEXT we must be able to skip shared objects.  */
 extern ElfW(Addr) _dl_lookup_symbol_skip (const char *undef,
                                          const ElfW(Sym) **sym,
-                                         struct link_map *symbol_scope[],
+                                         struct r_scope_elem *symbol_scope[],
                                          const char *reference_name,
                                          struct link_map *skip_this)
      internal_function;
@@ -308,7 +318,7 @@ extern ElfW(Addr) _dl_lookup_symbol_skip (const char *undef,
    skip shared objects.  */
 extern ElfW(Addr) _dl_lookup_versioned_symbol_skip (const char *undef,
                                                    const ElfW(Sym) **sym,
-                                                   struct link_map *symbol_scope[],
+                                                   struct r_scope_elem *symbol_scope[],
                                                    const char *reference_name,
                                                    const struct r_found_version *version,
                                                    struct link_map *skip_this)
@@ -325,48 +335,31 @@ extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name)
 
 /* Structure describing the dynamic linker itself.  */
 extern struct link_map _dl_rtld_map;
-
-/* The list of objects currently loaded is the third element of the
-   `_dl_default_scope' array, and the fourth element is always null.
-   This leaves two slots before it that are used when resolving
-   DT_SYMBOLIC objects' references one after it for normal references
-   (see below).  */
-#define _dl_loaded     (_dl_default_scope[2])
-extern struct link_map *_dl_default_scope[5];
-
-/* Null-terminated list of objects in the dynamic `global scope'.  The
-   list starts at [2]; i.e. &_dl_global_scope[2] is the argument
-   passed to _dl_lookup_symbol to search the global scope.  To search
-   a specific object and its dependencies in preference to the global
-   scope, fill in the [1] slot and pass its address; for two specific
-   object scopes, fill [0] and [1].  The list is double-terminated; to
-   search the global scope and then a specific object and its
-   dependencies, set *_dl_global_scope_end.  This variable initially
-   points to _dl_default_scope, and _dl_loaded is always kept in [2]
-   of this list.  A new list is malloc'd when new objects are loaded
-   with RTLD_GLOBAL.  */
-extern struct link_map **_dl_global_scope, **_dl_global_scope_end;
-extern size_t _dl_global_scope_alloc; /* Number of slots malloc'd.  */
-
-/* Hack _dl_global_scope[0] and [1] as necessary, and return a pointer into
-   _dl_global_scope that should be passed to _dl_lookup_symbol for symbol
-   references made in the object MAP's relocations.  */
-extern struct link_map **_dl_object_relocation_scope (struct link_map *map)
-     internal_function;
-
+/* And a pointer to the map for the main map.  */
+extern struct link_map *_dl_loaded;
+/* Array representing global scope.  */
+extern struct r_scope_elem *_dl_global_scope[2];
+/* Direct pointer to the searchlist of the main object.  */
+extern struct r_scope_elem *_dl_main_searchlist;
+/* Copy of the content of `_dl_main_searchlist'.  */
+extern struct r_scope_elem _dl_initial_searchlist;
+/* This is zero at program start to signal that the global scope map is
+   allocated by rtld.  Later it keeps the size of the map.  It might be
+   reset if in _dl_close if the last global object is removed.  */
+extern size_t _dl_global_scope_alloc;
 
 /* Allocate a `struct link_map' for a new object being loaded,
-   and enter it into the _dl_loaded list.  */
+   and enter it into the _dl_main_map list.  */
 extern struct link_map *_dl_new_object (char *realname, const char *libname,
-                                       int type) internal_function;
+                                       int type, struct link_map *loader)
+     internal_function;
 
 /* Relocate the given object (if it hasn't already been).
    SCOPE is passed to _dl_lookup_symbol in symbol lookups.
    If LAZY is nonzero, don't relocate its PLT.  */
 extern void _dl_relocate_object (struct link_map *map,
-                                struct link_map *scope[],
-                                int lazy, int consider_profiling)
-     internal_function;
+                                struct r_scope_elem *scope[],
+                                int lazy, int consider_profiling);
 
 /* Check the version dependencies of all objects available through
    MAP.  If VERBOSE print some more diagnostics.  */
@@ -378,11 +371,11 @@ extern int _dl_check_all_versions (struct link_map *map, int verbose)
 extern int _dl_check_map_versions (struct link_map *map, int verbose)
      internal_function;
 
-/* Return the address of the next initializer function for MAP or one of
+/* Return the address of the next initializer function for SCOPE or one of
    its dependencies that has not yet been run.  When there are no more
    initializers to be run, this returns zero.  The functions are returned
    in the order they should be called.  */
-extern ElfW(Addr) _dl_init_next (struct link_map *map) internal_function;
+extern ElfW(Addr) _dl_init_next (struct r_scope_elem *scope) internal_function;
 
 /* Call the finalizer functions of all shared objects whose
    initializer functions have completed.  */