Relative DT_RPATH/DT_RUNPATH vs. sysroot capable ld.
authorAlan Modra <amodra@gmail.com>
Thu, 24 Sep 2015 03:43:57 +0000 (13:13 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 24 Sep 2015 13:05:04 +0000 (22:35 +0930)
This fixes two problems.  First, the --sysroot option wasn't available
with a ld configured without --with-sysroot, a historical accident.
This led to people configuring binutils with --with-sysroot=/ in order
to enable sysroot support, which exposes a case where ld wrongly
prepends the sysroot to a relative path.

PR ld/18992
* ldmain.c (main): Always enable --sysroot.
* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Don't
prepend sysroot to relative rpath/runpath.

ld/ChangeLog
ld/emultempl/elf32.em
ld/ldmain.c

index 3b69e31e1751ba1db63e5e10cb1b81d8d672ba77..9b664d0f4d8fa6804de573c4bae84b659186a6eb 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-24  Alan Modra  <amodra@gmail.com>
+
+       PR ld/18992
+       * ldmain.c (main): Always enable --sysroot.
+       * emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Don't
+       prepend sysroot to relative rpath/runpath.
+
 2015-09-23  Nick Clifton  <nickc@redhat.com>
 
        * emultempl/elf32.em (ehdr_start_empty): New static variable.
index ea6d48c701b1a61c30ca229a9eacba72e627705b..8ff5fe0a2619ca81dbd47d9b66c0eff417a0a1e3 100644 (file)
@@ -1256,12 +1256,16 @@ fragment <<EOF
          rp = bfd_elf_get_runpath_list (link_info.output_bfd, &link_info);
          for (; !found && rp != NULL; rp = rp->next)
            {
-             char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name);
+             const char *tmpname = rp->name;
+
+             if (IS_ABSOLUTE_PATH (tmpname))
+               tmpname = gld${EMULATION_NAME}_add_sysroot (tmpname);
              found = (rp->by == l->by
                       && gld${EMULATION_NAME}_search_needed (tmpname,
                                                              &n,
                                                              force));
-             free (tmpname);
+             if (tmpname != rp->name)
+               free ((char *) tmpname);
            }
          if (found)
            break;
index 577928d5504ea51fab1316c9fc0d1106e5258c3c..96d7fe81ef7c8537f7cfb40b44f66c2a6496bced 100644 (file)
@@ -222,15 +222,7 @@ main (int argc, char **argv)
   /* Set up the sysroot directory.  */
   ld_sysroot = get_sysroot (argc, argv);
   if (*ld_sysroot)
-    {
-      if (*TARGET_SYSTEM_ROOT == 0)
-       {
-         einfo ("%P%F: this linker was not configured to use sysroots\n");
-         ld_sysroot = "";
-       }
-      else
-       ld_canon_sysroot = lrealpath (ld_sysroot);
-    }
+    ld_canon_sysroot = lrealpath (ld_sysroot);
   if (ld_canon_sysroot)
     ld_canon_sysroot_len = strlen (ld_canon_sysroot);
   else