summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-11 21:07:00 +0000
committerRoland McGrath <roland@gnu.org>1996-06-11 21:07:00 +0000
commit852fc4b91e0c657e02c7d15bc24fbbae066ccae3 (patch)
tree16e0d249a0b7b0f6d47a410cdfdfe890d7a898cb
parent6ba35316626b0aec32d29b7307965de4f4bb59fb (diff)
downloadglibc-852fc4b91e0c657e02c7d15bc24fbbae066ccae3.tar.gz
glibc-852fc4b91e0c657e02c7d15bc24fbbae066ccae3.tar.xz
glibc-852fc4b91e0c657e02c7d15bc24fbbae066ccae3.zip
* elf/Makefile ($(objpfx)$(rtld-installed-name)): New target to make
	link to ld.so if that is not the installed name.
	(lib-noranlib): Depend on the installed name in the build directory
	instead of on ld.so.

	* Makeconfig (link-libc): Include $(elfobjdir)/$(rtld-installed-name)
	between libc.so and libc.a, because with libc.so's DT_NEEDED for ld.so
	ld searches libc.a before ld.so (is that an ld bug?).
	Add $(elfobjdir) to -rpath-link.

	* Makerules (elfobjdir): Define as . when $(subdir) is elf.

	* sysdeps/i386/dl-machine.h (elf_machine_rel): In R_386_32 case when
	relocating _dl_rtld_map, subtract SYM's value from final reloc value,
	but don't change *RELOC_ADDR before calling *RESOLVE, because it might
	call the function we are relocating!
-rw-r--r--ChangeLog17
-rw-r--r--Makeconfig3
-rw-r--r--Makerules4
-rw-r--r--elf/Makefile11
-rw-r--r--string/Makefile2
-rw-r--r--string/basename.c27
-rw-r--r--sysdeps/i386/dl-machine.h21
7 files changed, 70 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 852a809b87..bfa537b79e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 Tue Jun 11 15:09:15 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
+	* elf/Makefile ($(objpfx)$(rtld-installed-name)): New target to make
+	link to ld.so if that is not the installed name.
+	(lib-noranlib): Depend on the installed name in the build directory
+	instead of on ld.so.
+
+	* Makeconfig (link-libc): Include $(elfobjdir)/$(rtld-installed-name)
+	between libc.so and libc.a, because with libc.so's DT_NEEDED for ld.so
+	ld searches libc.a before ld.so (is that an ld bug?).
+	Add $(elfobjdir) to -rpath-link.
+
+	* Makerules (elfobjdir): Define as . when $(subdir) is elf.
+
+	* sysdeps/i386/dl-machine.h (elf_machine_rel): In R_386_32 case when
+	relocating _dl_rtld_map, subtract SYM's value from final reloc value,
+	but don't change *RELOC_ADDR before calling *RESOLVE, because it might
+	call the function we are relocating!
+
 	* string/basename.c: New file.
 	* string/Makefile (routines): Add basename.
 
diff --git a/Makeconfig b/Makeconfig
index d2bbbb2517..0bb64bc288 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -312,8 +312,9 @@ ifeq (yes,$(build-shared))
 # We need the versioned name of libc.so in the deps of $(others) et al
 # so that the symlink to libc.so is created before anything tries to
 # run the linked programs.
-link-libc = -Wl,-rpath-link=$(common-objdir) \
+link-libc = -Wl,-rpath-link=$(common-objdir):$(elfobjdir) \
 	    $(common-objpfx)libc.so$(libc.so-version) \
+	    $(elfobjdir)/$(rtld-installed-name) \
 	    $(common-objpfx)libc.a $(gnulib)
 # Choose the default search path for the dynamic linker based on
 # where we will install libraries.
diff --git a/Makerules b/Makerules
index 0310b000c4..27053f31e8 100644
--- a/Makerules
+++ b/Makerules
@@ -493,7 +493,11 @@ LDFLAGS-c.so = -nostdlib -nostartfiles
 # Give libc.so an entry point and make it directly runnable itself.
 LDFLAGS-c.so += -e __libc_print_version
 # Use our own special initializer and finalizer files for libc.so.
+ifeq (elf, $(subdir))
+elfobjdir := .
+else
 elfobjdir := $(firstword $(objdir) $(..)elf)
+endif
 $(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
 			 $(common-objpfx)libc_pic.a \
 			 $(elfobjdir)/sofini.so $(elfobjdir)/ld.so
diff --git a/elf/Makefile b/elf/Makefile
index c2c8f7c5b2..5a550a10a2 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -53,7 +53,8 @@ install-bin	= ldd
 
 # Make sure these things are built in the `make lib' pass so they can be used
 # to run programs during the `make others' pass.
-lib-noranlib: $(objpfx)ld.so $(addprefix $(objpfx),$(extra-objs))
+lib-noranlib: $(objpfx)$(rtld-installed-name) \
+	      $(addprefix $(objpfx),$(extra-objs))
 
 ifneq (,$(filter linux% linux,$(config-os)))
 extra-objs	+= linux-compat.so
@@ -92,6 +93,14 @@ endef
 # The dl code in the static libc needs a default library path.
 CFLAGS-dl-support.c = -D'DEFAULT_RPATH="$(default-rpath)"'
 
+ifneq (ld.so, $(rtld-installed-name))
+# Make sure ld-gnu.so.1 exists in the build directory so we can link
+# against it.
+$(objpfx)$(rtld-installed-name): $(objpfx)ld.so
+	rm -f $@
+	ln $< $@
+endif
+
 # The Linux-compatible dynamic linker shared object is just the same
 # with one object file of compatibility initialization code added.
 $(objpfx)ld-linux.so.1: $(objpfx)linux-compat.so
diff --git a/string/Makefile b/string/Makefile
index 8325c6f26b..99106c4583 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -35,7 +35,7 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn strdup	\
 		   swab strfry memfrob memmem				\
 		   $(addprefix argz-,append count create ctsep next	\
 			             delete extract insert stringify)	\
-		   envz
+		   envz basename
 
 tests		:= tester testcopy test-ffs tst-strlen
 distribute	:= memcopy.h pagecopy.h
diff --git a/string/basename.c b/string/basename.c
new file mode 100644
index 0000000000..95bc003846
--- /dev/null
+++ b/string/basename.c
@@ -0,0 +1,27 @@
+/* basename -- return the name-within-directory of a file name.
+Copyright (C) 1996 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 Library General Public License as
+published by the Free Software Foundation; either version 2 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <string.h>
+
+char *
+basename (const char *filename)
+{
+  char *p = strrchr (filename, '/');
+  return p ? p + 1 : filename;
+}
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index bcd388fd20..a718792e0a 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -79,7 +79,7 @@ elf_machine_rel (struct link_map *map,
 					int noplt))
 {
   Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
-  Elf32_Addr loadbase;
+  Elf32_Addr loadbase, undo;
 
   switch (ELF32_R_TYPE (reloc->r_info))
     {
@@ -101,20 +101,17 @@ elf_machine_rel (struct link_map *map,
       break;
     case R_386_32:
       if (resolve && map == &_dl_rtld_map)
-	{
-	  /* Undo the relocation done here during bootstrapping.  Now we will
-	     relocate it anew, possibly using a binding found in the user
-	     program or a loaded library rather than the dynamic linker's
-	     built-in definitions used while loading those libraries.  */
-	  const Elf32_Sym *const dlsymtab
-	    = (void *) (map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
-	  *reloc_addr -= (map->l_addr +
-			  dlsymtab[ELF32_R_SYM (reloc->r_info)].st_value);
-	}
+	/* Undo the relocation done here during bootstrapping.  Now we will
+	   relocate it anew, possibly using a binding found in the user
+	   program or a loaded library rather than the dynamic linker's
+	   built-in definitions used while loading those libraries.  */
+	undo = map->l_addr + sym->st_value;
+      else
+	undo = 0;
       loadbase = (resolve ? (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0) :
 		  /* RESOLVE is null during bootstrap relocation.  */
 		  map->l_addr);
-      *reloc_addr += sym ? (loadbase + sym->st_value) : 0;
+      *reloc_addr += (sym ? (loadbase + sym->st_value) : 0) - undo;
       break;
     case R_386_RELATIVE:
       if (!resolve || map != &_dl_rtld_map) /* Already done in rtld itself.  */