about summary refs log tree commit diff
path: root/elf/dl-ifunc.h
diff options
context:
space:
mode:
Diffstat (limited to 'elf/dl-ifunc.h')
-rw-r--r--elf/dl-ifunc.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/elf/dl-ifunc.h b/elf/dl-ifunc.h
new file mode 100644
index 0000000000..39a5c12c73
--- /dev/null
+++ b/elf/dl-ifunc.h
@@ -0,0 +1,88 @@
+/* Private declarations for delayed IFUNC processing.
+   Copyright (C) 2017 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
+   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, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef DL_IFUNC_H
+#define DL_IFUNC_H
+
+#include <link.h>
+
+/* All functions declared in this file must be called while the global
+   rtld lock is acquired.  */
+
+/* Apply all pending IFUNC relocations in the search scope of the new
+   link map.  Deallocate all auxiliary allocations.  */
+void _dl_ifunc_apply_relocations (struct link_map *new)
+  attribute_hidden internal_function;
+
+/* Clear all allocated delayed IFUNC relocations in the namespace of
+   the link map.  Deallocate all auxiliary allocations.  This function
+   is intended for clearing up after a dlopen failure.  */
+void _dl_ifunc_clear_relocations (struct link_map *map)
+  attribute_hidden internal_function;
+
+/* The no-op implementatoin is only available if IFUNCs are
+   supported.  */
+#ifdef HAVE_IFUNC
+
+/* Delayed IFUNC relocation.  For each link map with a referenced
+   IFUNC symbol, a separate single-linked list of delayed IFUNC
+   relocations exists while the dynamic linker is running.  */
+struct dl_ifunc_relocation
+{
+  /* Information about the relocation.  */
+  struct link_map *reloc_map;
+  const ElfW(Rela) *reloc;
+  ElfW(Addr) *reloc_addr;
+
+  /* Information about the IFUNC resolver.  The corresponding symbol
+     map is implied.  */
+  const ElfW(Sym) *ifunc_sym;
+
+  /* Pointer to the next element in the list of IFUNC relocations for
+     the symbol map.  */
+  struct dl_ifunc_relocation *next;
+};
+
+/* Record a delayed IFUNC relocation for IFUNC_SYM at *RELOC_ADDR.
+   The relocation is associated with IFUNC_MAP.  Can raise an error
+   using _dl_signal_error.  IFUNC_SYM can be NULL if the relocation is
+   a relative IFUNC relocation.  */
+void _dl_ifunc_record_reloc (struct link_map *reloc_map,
+                             const ElfW(Rela) *reloc,
+                             ElfW(Addr) *reloc_addr,
+                             struct link_map *ifunc_map,
+                             const ElfW(Sym) *ifunc_sym)
+  attribute_hidden internal_function;
+
+#else /* !HAVE_IFUNC  */
+
+/* Dummy implementations for targets without IFUNC support.  */
+
+static inline void
+_dl_ifunc_apply_relocations (struct link_map *new)
+{
+}
+
+static inline void
+_dl_ifunc_clear_relocations (struct link_map *map)
+{
+}
+
+#endif /* !HAVE_IFUNC */
+
+#endif /* DL_IFUNC_H */