2000-08-22 H.J. Lu <hjl@gnu.org>
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 22 Aug 2000 19:34:37 +0000 (19:34 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 22 Aug 2000 19:34:37 +0000 (19:34 +0000)
* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Search
the DT_RPATH/DT_RUNPATH entries for DT_NEEDED after
LD_LIBRARY_PATH for native linker. Display the needed DSO if
trace_file_tries is non-zero.
(gld${EMULATION_NAME}_try_needed): Report the needed DSO found
if trace_file_tries is non-zero.

* ld.texinfo: Document the usage of DT_RPATH/DT_RUNPATH.
* News: Mention it.

ld/ChangeLog
ld/NEWS
ld/emultempl/elf32.em
ld/ld.texinfo

index 043f67f9227894f29f492be3b3b0fe5e4cba7caa..af430e8e358bc33f8853d159865433d985a9259a 100644 (file)
@@ -1,3 +1,15 @@
+2000-08-22  H.J. Lu  <hjl@gnu.org>
+
+       * emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Search
+       the DT_RPATH/DT_RUNPATH entries for DT_NEEDED after
+       LD_LIBRARY_PATH for native linker. Display the needed DSO if
+       trace_file_tries is non-zero.
+       (gld${EMULATION_NAME}_try_needed): Report the needed DSO found
+       if trace_file_tries is non-zero.
+
+       * ld.texinfo: Document the usage of DT_RPATH/DT_RUNPATH.
+       * News: Mention it.
+
 2000-08-14  Jason Eckhardt  <jle@cygnus.com>
 
        * NEWS: Mention i860 support.
diff --git a/ld/NEWS b/ld/NEWS
index ab47dc7f7112a5f5be17021c76233a6f42f6b916..0e0e98c8b713ec63cc1fb4bdc74e76bf221554c4 100644 (file)
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,8 @@
 -*- text -*-
 
+* The native ELF linker now searches the directories in DT_RUNPATH or
+  DT_RPATH of a shared library for shared libraries needed by it.
+
 * TI C54x support, by Timothy Wall.
 
 * Added command line switch --section-start to set the start address of any
index c1f5e31828e2da7ac38b41691e641808f40532b3..dee6e8c036bcd6df97cdcdb4d73a6235dced294c 100644 (file)
@@ -254,6 +254,7 @@ gld${EMULATION_NAME}_try_needed (name, force)
      int force;
 {
   bfd *abfd;
+  const char *soname;
 
   abfd = bfd_openr (name, bfd_get_target (output_bfd));
   if (abfd == NULL)
@@ -337,6 +338,17 @@ cat >>e${EMULATION_NAME}.c <<EOF
 
   if (bfd_stat (abfd, &global_stat) != 0)
     einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
+
+  /* First strip off everything before the last '/'.  */
+  soname = strrchr (abfd->filename, '/');
+  if (soname)
+    soname++;
+  else
+    soname = abfd->filename;
+
+  if (trace_file_tries)
+    info_msg (_("found %s at %s\n"), soname, name);
+
   global_found = false;
   lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
   if (global_found)
@@ -350,17 +362,10 @@ cat >>e${EMULATION_NAME}.c <<EOF
      DT_NEEDED entry for this file.  */
   bfd_elf_set_dt_needed_name (abfd, "");
 
-  /* First strip off everything before the last '/'.  */
-  name = strrchr (abfd->filename, '/');
-  if (name)
-    name++;
-  else
-    name = abfd->filename;
-
   /* Tell the ELF backend that the output file needs a DT_NEEDED
      entry for this file if it is used to resolve the reference in
      a regular object.  */
-  bfd_elf_set_dt_needed_soname (abfd, name);
+  bfd_elf_set_dt_needed_soname (abfd, soname);
 
   /* Add this file into the symbol table.  */
   if (! bfd_link_add_symbols (abfd, &link_info))
@@ -565,11 +570,34 @@ static void
 gld${EMULATION_NAME}_after_open ()
 {
   struct bfd_link_needed_list *needed, *l;
+EOF
+if [ "x${host}" = "x${target}" ] ; then
+  case " ${EMULATION_LIBPATH} " in
+  *" ${EMULATION_NAME} "*)
+cat >>e${EMULATION_NAME}.c <<EOF
+  struct bfd_link_needed_list *run_path;
+EOF
+  ;;
+  esac
+fi
+cat >>e${EMULATION_NAME}.c <<EOF
 
   /* We only need to worry about this when doing a final link.  */
   if (link_info.relocateable || link_info.shared)
     return;
 
+EOF
+if [ "x${host}" = "x${target}" ] ; then
+  case " ${EMULATION_LIBPATH} " in
+  *" ${EMULATION_NAME} "*)
+cat >>e${EMULATION_NAME}.c <<EOF
+  run_path = bfd_elf_get_runpath_list (output_bfd, &link_info);
+EOF
+  ;;
+  esac
+fi
+cat >>e${EMULATION_NAME}.c <<EOF
+
   /* Get the list of files which appear in DT_NEEDED entries in
      dynamic objects included in the link (often there will be none).
      For each such file, we want to track down the corresponding
@@ -584,6 +612,18 @@ gld${EMULATION_NAME}_after_open ()
     {
       struct bfd_link_needed_list *ll;
       int force;
+EOF
+if [ "x${host}" = "x${target}" ] ; then
+  case " ${EMULATION_LIBPATH} " in
+  *" ${EMULATION_NAME} "*)
+cat >>e${EMULATION_NAME}.c <<EOF
+      struct bfd_link_needed_list *rp;
+      int found;
+EOF
+  ;;
+  esac
+fi
+cat >>e${EMULATION_NAME}.c <<EOF
 
       /* If we've already seen this file, skip it.  */
       for (ll = needed; ll != l; ll = ll->next)
@@ -599,12 +639,16 @@ gld${EMULATION_NAME}_after_open ()
       if (global_found)
        continue;
 
+      if (trace_file_tries)
+       info_msg (_("%s needed by %B\n"), l->name, l->by);
+
       /* We need to find this file and include the symbol table.  We
         want to search for the file in the same way that the dynamic
         linker will search.  That means that we want to use
         rpath_link, rpath, then the environment variable
-        LD_LIBRARY_PATH (native only), then the linker script
-        LIB_SEARCH_DIRS.  We do not search using the -L arguments.
+        LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
+        entries (native only), then the linker script LIB_SEARCH_DIRS.
+        We do not search using the -L arguments.
 
         We search twice.  The first time, we skip objects which may
         introduce version mismatches.  The second time, we force
@@ -637,6 +681,18 @@ cat >>e${EMULATION_NAME}.c <<EOF
          lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
          if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
            break;
+
+         found = 0;
+         for (rp = run_path; !found && rp != NULL; rp = rp->next)
+           {
+             found = (rp->by == l->by
+                      && gld${EMULATION_NAME}_search_needed (rp->name,
+                                                             l->name,
+                                                             force));
+           }
+         if (found)
+           break;
+
 EOF
   ;;
   esac
index cce83222fd93dca03eec6069def5449515ca4623..e3ecaa48e02d3a8c11e856f793705e4f77e5e82c 100644 (file)
@@ -1101,6 +1101,11 @@ directories specified using @code{-L} options.
 For a native linker, the contents of the environment variable
 @code{LD_LIBRARY_PATH}.
 @item
+For a native ELF linker, the directories in @code{DT_RUNPATH} or
+@code{DT_RPATH} of a shared library are searched for shared
+libraries needed by it. The @code{DT_RPATH} entries are ignored if
+@code{DT_RUNPATH} entries exist.
+@item
 The default directories, normally @file{/lib} and @file{/usr/lib}.
 @item
 For a native linker on an ELF system, if the file @file{/etc/ld.so.conf}