Blame include/link.h

Packit Service 82fcde
/* Data structure for communication from the run-time dynamic linker for
Packit Service 82fcde
   loaded ELF shared objects.
Packit Service 82fcde
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef	_PRIVATE_LINK_H
Packit Service 82fcde
#define	_PRIVATE_LINK_H	1
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LINK_H
Packit Service 82fcde
# error this should be impossible
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
# ifndef _ISOMAC
Packit Service 82fcde
/* Get most of the contents from the public header, but we define a
Packit Service 82fcde
   different `struct link_map' type for private use.  The la_objopen
Packit Service 82fcde
   prototype uses the type, so we have to declare it separately.  */
Packit Service 82fcde
#  define link_map	link_map_public
Packit Service 82fcde
#  define la_objopen	la_objopen_wrongproto
Packit Service 82fcde
# endif
Packit Service 82fcde
Packit Service 82fcde
#include <elf/link.h>
Packit Service 82fcde
Packit Service 82fcde
# ifndef _ISOMAC
Packit Service 82fcde
Packit Service 82fcde
#undef	link_map
Packit Service 82fcde
#undef	la_objopen
Packit Service 82fcde
Packit Service 82fcde
struct link_map;
Packit Service 82fcde
extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid,
Packit Service 82fcde
				uintptr_t *__cookie);
Packit Service 82fcde
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include <stddef.h>
Packit Service 82fcde
#include <linkmap.h>
Packit Service 82fcde
#include <dl-fileid.h>
Packit Service 82fcde
#include <dl-lookupcfg.h>
Packit Service 82fcde
#include <tls.h>
Packit Service 82fcde
#include <libc-lock.h>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Some internal data structures of the dynamic linker used in the
Packit Service 82fcde
   linker map.  We only provide forward declarations.  */
Packit Service 82fcde
struct libname_list;
Packit Service 82fcde
struct r_found_version;
Packit Service 82fcde
struct r_search_path_elem;
Packit Service 82fcde
Packit Service 82fcde
/* Forward declaration.  */
Packit Service 82fcde
struct link_map;
Packit Service 82fcde
Packit Service 82fcde
/* Structure to describe a single list of scope elements.  The lookup
Packit Service 82fcde
   functions get passed an array of pointers to such structures.  */
Packit Service 82fcde
struct r_scope_elem
Packit Service 82fcde
{
Packit Service 82fcde
  /* Array of maps for the scope.  */
Packit Service 82fcde
  struct link_map **r_list;
Packit Service 82fcde
  /* Number of entries in the scope.  */
Packit Service 82fcde
  unsigned int r_nlist;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure to record search path and allocation mechanism.  */
Packit Service 82fcde
struct r_search_path_struct
Packit Service 82fcde
  {
Packit Service 82fcde
    struct r_search_path_elem **dirs;
Packit Service 82fcde
    int malloced;
Packit Service 82fcde
  };
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure describing a loaded shared object.  The `l_next' and `l_prev'
Packit Service 82fcde
   members form a chain of all the shared objects loaded at startup.
Packit Service 82fcde
Packit Service 82fcde
   These data structures exist in space used by the run-time dynamic linker;
Packit Service 82fcde
   modifying them may have disastrous results.
Packit Service 82fcde
Packit Service 82fcde
   This data structure might change in future, if necessary.  User-level
Packit Service 82fcde
   programs must avoid defining objects of this type.  */
Packit Service 82fcde
Packit Service 82fcde
struct link_map
Packit Service 82fcde
  {
Packit Service 82fcde
    /* These first few members are part of the protocol with the debugger.
Packit Service 82fcde
       This is the same format used in SVR4.  */
Packit Service 82fcde
Packit Service 82fcde
    ElfW(Addr) l_addr;		/* Difference between the address in the ELF
Packit Service 82fcde
				   file and the addresses in memory.  */
Packit Service 82fcde
    char *l_name;		/* Absolute file name object was found in.  */
Packit Service 82fcde
    ElfW(Dyn) *l_ld;		/* Dynamic section of the shared object.  */
Packit Service 82fcde
    struct link_map *l_next, *l_prev; /* Chain of loaded objects.  */
Packit Service 82fcde
Packit Service 82fcde
    /* All following members are internal to the dynamic linker.
Packit Service 82fcde
       They may change without notice.  */
Packit Service 82fcde
Packit Service 82fcde
    /* This is an element which is only ever different from a pointer to
Packit Service 82fcde
       the very same copy of this type for ld.so when it is used in more
Packit Service 82fcde
       than one namespace.  */
Packit Service 82fcde
    struct link_map *l_real;
Packit Service 82fcde
Packit Service 82fcde
    /* Number of the namespace this link map belongs to.  */
Packit Service 82fcde
    Lmid_t l_ns;
Packit Service 82fcde
Packit Service 82fcde
    struct libname_list *l_libname;
Packit Service 82fcde
    /* Indexed pointers to dynamic section.
Packit Service 82fcde
       [0,DT_NUM) are indexed by the processor-independent tags.
Packit Service 82fcde
       [DT_NUM,DT_NUM+DT_THISPROCNUM) are indexed by the tag minus DT_LOPROC.
Packit Service 82fcde
       [DT_NUM+DT_THISPROCNUM,DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM) are
Packit Service 82fcde
       indexed by DT_VERSIONTAGIDX(tagvalue).
Packit Service 82fcde
       [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM,
Packit Service 82fcde
	DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM) are indexed by
Packit Service 82fcde
       DT_EXTRATAGIDX(tagvalue).
Packit Service 82fcde
       [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM,
Packit Service 82fcde
	DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM+DT_VALNUM) are
Packit Service 82fcde
       indexed by DT_VALTAGIDX(tagvalue) and
Packit Service 82fcde
       [DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM+DT_VALNUM,
Packit Service 82fcde
	DT_NUM+DT_THISPROCNUM+DT_VERSIONTAGNUM+DT_EXTRANUM+DT_VALNUM+DT_ADDRNUM)
Packit Service 82fcde
       are indexed by DT_ADDRTAGIDX(tagvalue), see <elf.h>.  */
Packit Service 82fcde
Packit Service 82fcde
    ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM
Packit Service 82fcde
		      + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM];
Packit Service 82fcde
    const ElfW(Phdr) *l_phdr;	/* Pointer to program header table in core.  */
Packit Service 82fcde
    ElfW(Addr) l_entry;		/* Entry point location.  */
Packit Service 82fcde
    ElfW(Half) l_phnum;		/* Number of program header entries.  */
Packit Service 82fcde
    ElfW(Half) l_ldnum;		/* Number of dynamic segment entries.  */
Packit Service 82fcde
Packit Service 82fcde
    /* Array of DT_NEEDED dependencies and their dependencies, in
Packit Service 82fcde
       dependency order for symbol lookup (with and without
Packit Service 82fcde
       duplicates).  There is no entry before the dependencies have
Packit Service 82fcde
       been loaded.  */
Packit Service 82fcde
    struct r_scope_elem l_searchlist;
Packit Service 82fcde
Packit Service 82fcde
    /* We need a special searchlist to process objects marked with
Packit Service 82fcde
       DT_SYMBOLIC.  */
Packit Service 82fcde
    struct r_scope_elem l_symbolic_searchlist;
Packit Service 82fcde
Packit Service 82fcde
    /* Dependent object that first caused this object to be loaded.  */
Packit Service 82fcde
    struct link_map *l_loader;
Packit Service 82fcde
Packit Service 82fcde
    /* Array with version names.  */
Packit Service 82fcde
    struct r_found_version *l_versions;
Packit Service 82fcde
    unsigned int l_nversions;
Packit Service 82fcde
Packit Service 82fcde
    /* Symbol hash table.  */
Packit Service 82fcde
    Elf_Symndx l_nbuckets;
Packit Service 82fcde
    Elf32_Word l_gnu_bitmask_idxbits;
Packit Service 82fcde
    Elf32_Word l_gnu_shift;
Packit Service 82fcde
    const ElfW(Addr) *l_gnu_bitmask;
Packit Service 82fcde
    union
Packit Service 82fcde
    {
Packit Service 82fcde
      const Elf32_Word *l_gnu_buckets;
Packit Service 82fcde
      const Elf_Symndx *l_chain;
Packit Service 82fcde
    };
Packit Service 82fcde
    union
Packit Service 82fcde
    {
Packit Service 82fcde
      const Elf32_Word *l_gnu_chain_zero;
Packit Service 82fcde
      const Elf_Symndx *l_buckets;
Packit Service 82fcde
    };
Packit Service 82fcde
Packit Service 82fcde
    unsigned int l_direct_opencount; /* Reference count for dlopen/dlclose.  */
Packit Service 82fcde
    enum			/* Where this object came from.  */
Packit Service 82fcde
      {
Packit Service 82fcde
	lt_executable,		/* The main executable program.  */
Packit Service 82fcde
	lt_library,		/* Library needed by main executable.  */
Packit Service 82fcde
	lt_loaded		/* Extra run-time loaded shared object.  */
Packit Service 82fcde
      } l_type:2;
Packit Service 82fcde
    unsigned int l_relocated:1;	/* Nonzero if object's relocations done.  */
Packit Service 82fcde
    unsigned int l_init_called:1; /* Nonzero if DT_INIT function called.  */
Packit Service 82fcde
    unsigned int l_global:1;	/* Nonzero if object in _dl_global_scope.  */
Packit Service 82fcde
    unsigned int l_reserved:2;	/* Reserved for internal use.  */
Packit Service 82fcde
    unsigned int l_phdr_allocated:1; /* Nonzero if the data structure pointed
Packit Service 82fcde
					to by `l_phdr' is allocated.  */
Packit Service 82fcde
    unsigned int l_soname_added:1; /* Nonzero if the SONAME is for sure in
Packit Service 82fcde
				      the l_libname list.  */
Packit Service 82fcde
    unsigned int l_faked:1;	/* Nonzero if this is a faked descriptor
Packit Service 82fcde
				   without associated file.  */
Packit Service 82fcde
    unsigned int l_need_tls_init:1; /* Nonzero if GL(dl_init_static_tls)
Packit Service 82fcde
				       should be called on this link map
Packit Service 82fcde
				       when relocation finishes.  */
Packit Service 82fcde
    unsigned int l_auditing:1;	/* Nonzero if the DSO is used in auditing.  */
Packit Service 82fcde
    unsigned int l_audit_any_plt:1; /* Nonzero if at least one audit module
Packit Service 82fcde
				       is interested in the PLT interception.*/
Packit Service 82fcde
    unsigned int l_removed:1;	/* Nozero if the object cannot be used anymore
Packit Service 82fcde
				   since it is removed.  */
Packit Service 82fcde
    unsigned int l_contiguous:1; /* Nonzero if inter-segment holes are
Packit Service 82fcde
				    mprotected or if no holes are present at
Packit Service 82fcde
				    all.  */
Packit Service 82fcde
    unsigned int l_symbolic_in_local_scope:1; /* Nonzero if l_local_scope
Packit Service 82fcde
						 during LD_TRACE_PRELINKING=1
Packit Service 82fcde
						 contains any DT_SYMBOLIC
Packit Service 82fcde
						 libraries.  */
Packit Service 82fcde
    unsigned int l_free_initfini:1; /* Nonzero if l_initfini can be
Packit Service 82fcde
				       freed, ie. not allocated with
Packit Service 82fcde
				       the dummy malloc in ld.so.  */
Packit Service 82fcde
Packit Service 82fcde
#include <link_map.h>
Packit Service 82fcde
Packit Service 82fcde
    /* Collected information about own RPATH directories.  */
Packit Service 82fcde
    struct r_search_path_struct l_rpath_dirs;
Packit Service 82fcde
Packit Service 82fcde
    /* Collected results of relocation while profiling.  */
Packit Service 82fcde
    struct reloc_result
Packit Service 82fcde
    {
Packit Service 82fcde
      DL_FIXUP_VALUE_TYPE addr;
Packit Service 82fcde
      struct link_map *bound;
Packit Service 82fcde
      unsigned int boundndx;
Packit Service 82fcde
      uint32_t enterexit;
Packit Service 82fcde
      unsigned int flags;
Packit Service eead2c
      /* CONCURRENCY NOTE: This is used to guard the concurrent initialization
Packit Service eead2c
	 of the relocation result across multiple threads.  See the more
Packit Service eead2c
	 detailed notes in elf/dl-runtime.c.  */
Packit Service eead2c
      unsigned int init;
Packit Service 82fcde
    } *l_reloc_result;
Packit Service 82fcde
Packit Service 82fcde
    /* Pointer to the version information if available.  */
Packit Service 82fcde
    ElfW(Versym) *l_versyms;
Packit Service 82fcde
Packit Service 82fcde
    /* String specifying the path where this object was found.  */
Packit Service 82fcde
    const char *l_origin;
Packit Service 82fcde
Packit Service 82fcde
    /* Start and finish of memory map for this object.  l_map_start
Packit Service 82fcde
       need not be the same as l_addr.  */
Packit Service 82fcde
    ElfW(Addr) l_map_start, l_map_end;
Packit Service 82fcde
    /* End of the executable part of the mapping.  */
Packit Service 82fcde
    ElfW(Addr) l_text_end;
Packit Service 82fcde
Packit Service 82fcde
    /* Default array for 'l_scope'.  */
Packit Service 82fcde
    struct r_scope_elem *l_scope_mem[4];
Packit Service 82fcde
    /* Size of array allocated for 'l_scope'.  */
Packit Service 82fcde
    size_t l_scope_max;
Packit Service 82fcde
    /* This is an array defining the lookup scope for this link map.
Packit Service 82fcde
       There are initially at most three different scope lists.  */
Packit Service 82fcde
    struct r_scope_elem **l_scope;
Packit Service 82fcde
Packit Service 82fcde
    /* A similar array, this time only with the local scope.  This is
Packit Service 82fcde
       used occasionally.  */
Packit Service 82fcde
    struct r_scope_elem *l_local_scope[2];
Packit Service 82fcde
Packit Service 82fcde
    /* This information is kept to check for sure whether a shared
Packit Service 82fcde
       object is the same as one already loaded.  */
Packit Service 82fcde
    struct r_file_id l_file_id;
Packit Service 82fcde
Packit Service 82fcde
    /* Collected information about own RUNPATH directories.  */
Packit Service 82fcde
    struct r_search_path_struct l_runpath_dirs;
Packit Service 82fcde
Packit Service 82fcde
    /* List of object in order of the init and fini calls.  */
Packit Service 82fcde
    struct link_map **l_initfini;
Packit Service 82fcde
Packit Service 82fcde
    /* List of the dependencies introduced through symbol binding.  */
Packit Service 82fcde
    struct link_map_reldeps
Packit Service 82fcde
      {
Packit Service 82fcde
	unsigned int act;
Packit Service 82fcde
	struct link_map *list[];
Packit Service 82fcde
      } *l_reldeps;
Packit Service 82fcde
    unsigned int l_reldepsmax;
Packit Service 82fcde
Packit Service 82fcde
    /* Nonzero if the DSO is used.  */
Packit Service 82fcde
    unsigned int l_used;
Packit Service 82fcde
Packit Service 82fcde
    /* Various flag words.  */
Packit Service 82fcde
    ElfW(Word) l_feature_1;
Packit Service 82fcde
    ElfW(Word) l_flags_1;
Packit Service 82fcde
    ElfW(Word) l_flags;
Packit Service 82fcde
Packit Service 82fcde
    /* Temporarily used in `dl_close'.  */
Packit Service 82fcde
    int l_idx;
Packit Service 82fcde
Packit Service 82fcde
    struct link_map_machine l_mach;
Packit Service 82fcde
Packit Service 82fcde
    struct
Packit Service 82fcde
    {
Packit Service 82fcde
      const ElfW(Sym) *sym;
Packit Service 82fcde
      int type_class;
Packit Service 82fcde
      struct link_map *value;
Packit Service 82fcde
      const ElfW(Sym) *ret;
Packit Service 82fcde
    } l_lookup_cache;
Packit Service 82fcde
Packit Service 82fcde
    /* Thread-local storage related info.  */
Packit Service 82fcde
Packit Service 82fcde
    /* Start of the initialization image.  */
Packit Service 82fcde
    void *l_tls_initimage;
Packit Service 82fcde
    /* Size of the initialization image.  */
Packit Service 82fcde
    size_t l_tls_initimage_size;
Packit Service 82fcde
    /* Size of the TLS block.  */
Packit Service 82fcde
    size_t l_tls_blocksize;
Packit Service 82fcde
    /* Alignment requirement of the TLS block.  */
Packit Service 82fcde
    size_t l_tls_align;
Packit Service 82fcde
    /* Offset of first byte module alignment.  */
Packit Service 82fcde
    size_t l_tls_firstbyte_offset;
Packit Service 82fcde
#ifndef NO_TLS_OFFSET
Packit Service 82fcde
# define NO_TLS_OFFSET	0
Packit Service 82fcde
#endif
Packit Service 82fcde
#ifndef FORCED_DYNAMIC_TLS_OFFSET
Packit Service 82fcde
# if NO_TLS_OFFSET == 0
Packit Service 82fcde
#  define FORCED_DYNAMIC_TLS_OFFSET -1
Packit Service 82fcde
# elif NO_TLS_OFFSET == -1
Packit Service 82fcde
#  define FORCED_DYNAMIC_TLS_OFFSET -2
Packit Service 82fcde
# else
Packit Service 82fcde
#  error "FORCED_DYNAMIC_TLS_OFFSET is not defined"
Packit Service 82fcde
# endif
Packit Service 82fcde
#endif
Packit Service 82fcde
    /* For objects present at startup time: offset in the static TLS block.  */
Packit Service 82fcde
    ptrdiff_t l_tls_offset;
Packit Service 82fcde
    /* Index of the module in the dtv array.  */
Packit Service 82fcde
    size_t l_tls_modid;
Packit Service 82fcde
Packit Service 82fcde
    /* Number of thread_local objects constructed by this DSO.  This is
Packit Service 82fcde
       atomically accessed and modified and is not always protected by the load
Packit Service 82fcde
       lock.  See also: CONCURRENCY NOTES in cxa_thread_atexit_impl.c.  */
Packit Service 82fcde
    size_t l_tls_dtor_count;
Packit Service 82fcde
Packit Service 82fcde
    /* Information used to change permission after the relocations are
Packit Service 82fcde
       done.  */
Packit Service 82fcde
    ElfW(Addr) l_relro_addr;
Packit Service 82fcde
    size_t l_relro_size;
Packit Service 82fcde
Packit Service 82fcde
    unsigned long long int l_serial;
Packit Service 82fcde
Packit Service 82fcde
    /* Audit information.  This array apparent must be the last in the
Packit Service 82fcde
       structure.  Never add something after it.  */
Packit Service 82fcde
    struct auditstate
Packit Service 82fcde
    {
Packit Service 82fcde
      uintptr_t cookie;
Packit Service 82fcde
      unsigned int bindflags;
Packit Service 82fcde
    } l_audit[0];
Packit Service 82fcde
  };
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
#if __ELF_NATIVE_CLASS == 32
Packit Service 82fcde
# define symbind symbind32
Packit Service 82fcde
#elif __ELF_NATIVE_CLASS == 64
Packit Service 82fcde
# define symbind symbind64
Packit Service 82fcde
#else
Packit Service 82fcde
# error "__ELF_NATIVE_CLASS must be defined"
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
extern int __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
Packit Service 82fcde
					       size_t size, void *data),
Packit Service 82fcde
			      void *data);
Packit Service 82fcde
hidden_proto (__dl_iterate_phdr)
Packit Service 82fcde
Packit Service 82fcde
/* We use this macro to refer to ELF macros independent of the native
Packit Service 82fcde
   wordsize.  `ELFW(R_TYPE)' is used in place of `ELF32_R_TYPE' or
Packit Service 82fcde
   `ELF64_R_TYPE'.  */
Packit Service 82fcde
#define ELFW(type)	_ElfW (ELF, __ELF_NATIVE_CLASS, type)
Packit Service 82fcde
Packit Service 82fcde
# endif /* !_ISOMAC */
Packit Service 82fcde
#endif /* include/link.h */