Relative DT_RPATH/DT_RUNPATH vs. sysroot capable ld.
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.
This commit is contained in:
parent
938d3bf25b
commit
3074964fcf
@ -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.
|
||||
|
@ -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;
|
||||
|
10
ld/ldmain.c
10
ld/ldmain.c
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user