about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/Makefile3
-rw-r--r--elf/Versions55
-rw-r--r--elf/dl-fxstat64.c25
-rw-r--r--elf/dl-lookup.c4
-rw-r--r--elf/dl-xstat64.c25
5 files changed, 72 insertions, 40 deletions
diff --git a/elf/Makefile b/elf/Makefile
index 05f5c5aeb1..12277741c4 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -37,7 +37,8 @@ elide-routines.os = $(all-dl-routines) dl-support enbl-secure \
 
 # ld.so uses those routines, plus some special stuff for being the program
 # interpreter and operating independent of libc.
-rtld-routines	:= rtld $(dl-routines) dl-sysdep dl-environ dl-minimal
+rtld-routines	:= rtld $(dl-routines) dl-sysdep dl-environ dl-minimal \
+		   dl-xstat64 dl-fxstat64
 all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines)
 
 distribute	:= $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
diff --git a/elf/Versions b/elf/Versions
index af4f4b84a8..4c7806d8e6 100644
--- a/elf/Versions
+++ b/elf/Versions
@@ -1,7 +1,5 @@
 libc {
   GLIBC_2.0 {
-    # functions used in other libraries
-    _dl_open; _dl_close; _dl_addr;
 %ifdef EXPORT_UNWIND_FIND_FDE
     __register_frame_info; __deregister_frame_info;
 %endif
@@ -10,13 +8,6 @@ libc {
     # functions used in other libraries
     _dl_mcount_wrapper; _dl_mcount_wrapper_check;
   }
-  GLIBC_2.2 {
-    # this is defined in ld.so and overridden by libc
-    _dl_init_first;
-
-    # functions used in other libraries
-    _dl_sym; _dl_vsym;
-  }
   GLIBC_2.2.4 {
     dl_iterate_phdr;
   }
@@ -26,44 +17,34 @@ libc {
     __register_frame_info_table_bases; _Unwind_Find_FDE;
   }
 %endif
+  GLIBC_PRIVATE {
+    # functions used in other libraries
+    _dl_open; _dl_close; _dl_addr;
+    _dl_sym; _dl_vsym; _dl_init_first;
+  }
 }
 
 ld {
   GLIBC_2.0 {
-    # Those are in the dynamic linker, but used by libc.so.
-    __libc_enable_secure; _dl_catch_error; _dl_check_all_versions;
-    _dl_debug_initialize; _dl_debug_state;
-    _dl_lookup_symbol;
-    _dl_map_object; _dl_map_object_deps; _dl_object_relocation_scope;
-    _dl_relocate_object; _dl_signal_error; _dl_starting_up;
-    _dl_sysdep_start; _r_debug;
-    _dl_lookup_symbol_skip;
-    _dl_lookup_versioned_symbol; _dl_lookup_versioned_symbol_skip;
-
     # Function from libc.so which must be shared with libc.
     calloc; free; malloc; realloc;
-  }
-  GLIBC_2.1 {
-    # global variables
-    __libc_stack_end;
 
-    # functions used in other libraries
-    _dl_start_profile; _dl_mcount; _dl_unload_cache;
+    _r_debug;
   }
-  GLIBC_2.1.1 {
+  GLIBC_2.1 {
     # functions used in other libraries
-    _dl_dst_count; _dl_dst_substitute;
+    _dl_mcount;
   }
-  GLIBC_2.2 {
-    _dl_init; _dl_argv; _dl_check_map_versions;
-
-    # variables used elsewhere
-    _dl_out_of_memory;
-  }
-  GLIBC_2.2.3 {
-    _dl_debug_printf;
-  }
-  GLIBC_2.3 {
+  GLIBC_PRIVATE {
+    # Those are in the dynamic linker, but used by libc.so.
+    __libc_enable_secure; __libc_stack_end;
+    _dl_argv; _dl_catch_error; _dl_check_all_versions; _dl_check_map_versions;
+    _dl_debug_initialize; _dl_debug_printf; _dl_debug_state; _dl_dst_count;
+    _dl_dst_substitute; _dl_init; _dl_lookup_symbol; _dl_lookup_symbol_skip;
+    _dl_lookup_versioned_symbol; _dl_lookup_versioned_symbol_skip;
+    _dl_map_object; _dl_map_object_deps; _dl_out_of_memory;
+    _dl_relocate_object; _dl_signal_error; _dl_start_profile; _dl_starting_up;
+    _dl_sysdep_start; _dl_unload_cache;
     _rtld_global;
   }
 }
diff --git a/elf/dl-fxstat64.c b/elf/dl-fxstat64.c
new file mode 100644
index 0000000000..38d445d4d4
--- /dev/null
+++ b/elf/dl-fxstat64.c
@@ -0,0 +1,25 @@
+/* Dynamic linker's private version of __fxstat64.
+   Copyright (C) 2002 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* This special file is needed because some fxstat64.c implementations
+   use versioning for __fxstat64 and we need to keep it local to
+   the dynamic linker.  */
+
+#define RTLD_STAT64
+#include <fxstat64.c>
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
index 695ce54b4e..4f3285fee5 100644
--- a/elf/dl-lookup.c
+++ b/elf/dl-lookup.c
@@ -661,7 +661,7 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
 
 /* These are here so that we only inline do_lookup{,_versioned} in the common
    case, not everywhere.  */
-static int
+static int __attribute_noinline__
 internal_function
 _dl_do_lookup (const char *undef_name, unsigned long int hash,
 	       const ElfW(Sym) *ref, struct sym_val *result,
@@ -672,7 +672,7 @@ _dl_do_lookup (const char *undef_name, unsigned long int hash,
 		    type_class);
 }
 
-static int
+static int __attribute_noinline__
 internal_function
 _dl_do_lookup_versioned (const char *undef_name, unsigned long int hash,
 			 const ElfW(Sym) *ref, struct sym_val *result,
diff --git a/elf/dl-xstat64.c b/elf/dl-xstat64.c
new file mode 100644
index 0000000000..4484f990e0
--- /dev/null
+++ b/elf/dl-xstat64.c
@@ -0,0 +1,25 @@
+/* Dynamic linker's private version of __xstat64.
+   Copyright (C) 2002 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* This special file is needed because some xstat64.c implementations
+   use versioning for __xstat64 and we need to keep it local to
+   the dynamic linker.  */
+
+#define RTLD_STAT64
+#include <xstat64.c>