Enable new dtags in a way that works with binutils 2.30.

In 3027bca, binutils was upgraded from 2.28.1 to 2.30. However, in 2.30,
the ldmain.c file within binutils, which the nixpkgs new-dtags.patch
file is meant to modify, was changed in such a way that the patch no
longer works. As a result, the new dtags are not actually enabled, and
binaries are built with RPATH set instead of RUNPATH, thereby preventing
LD_LIBRARY_PATH from overriding this built-in path. This change corrects
this. The patch file is no longer necessary because binutils's ldmain.c
now sets link_info.new_dtags based on the configuration flags.

This was probably not noticed immediately because, when the derivation
is built with nix-build, the fixupPhase runs patchelf --shrink-rpath.
patchelf converts any RPATH in the binary into RUNPATH (unless
--force-rpath is specified).  Of course, if the binary is built without
nix-build (such as in a nix-shell), this never occurs, and any RPATH in
the binary is left in place.
This commit is contained in:
Matthew Stewart 2018-07-14 11:32:10 -04:00 committed by Tuomas Tynkkynen
parent 611eefb067
commit 18f517fbd6
2 changed files with 5 additions and 15 deletions

View File

@ -26,11 +26,6 @@ stdenv.mkDerivation rec {
}); });
patches = [ patches = [
# Turn on --enable-new-dtags by default to make the linker set
# RUNPATH instead of RPATH on binaries. This is important because
# RUNPATH can be overriden using LD_LIBRARY_PATH at runtime.
./new-dtags.patch
# Since binutils 2.22, DT_NEEDED flags aren't copied for dynamic outputs. # Since binutils 2.22, DT_NEEDED flags aren't copied for dynamic outputs.
# That requires upstream changes for things to work. So we can patch it to # That requires upstream changes for things to work. So we can patch it to
# get the old behaviour by now. # get the old behaviour by now.
@ -117,6 +112,11 @@ stdenv.mkDerivation rec {
"--enable-deterministic-archives" "--enable-deterministic-archives"
"--disable-werror" "--disable-werror"
"--enable-fix-loongson2f-nop" "--enable-fix-loongson2f-nop"
# Turn on --enable-new-dtags by default to make the linker set
# RUNPATH instead of RPATH on binaries. This is important because
# RUNPATH can be overriden using LD_LIBRARY_PATH at runtime.
"--enable-new-dtags"
] ++ optionals gold [ "--enable-gold" "--enable-plugins" ]; ] ++ optionals gold [ "--enable-gold" "--enable-plugins" ];
doCheck = false; # fails doCheck = false; # fails

View File

@ -1,10 +0,0 @@
--- binutils/ld/ldmain.c
+++ binutils/ld/ldmain.c
@@ -296,6 +296,7 @@ main (int argc, char **argv)
link_info.allow_undefined_version = TRUE;
link_info.keep_memory = TRUE;
+ link_info.new_dtags = TRUE;
link_info.combreloc = TRUE;
link_info.strip_discarded = TRUE;
link_info.callbacks = &link_callbacks;