summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoss Burton <ross.burton@intel.com>2016-10-03 14:16:32 (GMT)
committerSona Sarmadi <sona.sarmadi@enea.com>2017-02-10 11:21:36 (GMT)
commitcb31822a6c2dd856881330a356e9037e68db45dc (patch)
treefd4102b49bcbcfb39fa7e5d0876712ef8962bbbe
parent2477355247b8f2fb69ebe07504b532bcc6b4e8f3 (diff)
downloadpoky-cb31822a6c2dd856881330a356e9037e68db45dc.tar.gz
binutils: apply RPATH fixes from our libtool patches
We don't autoreconf/libtoolize binutils as it has very strict requirements, so extend our patching of the stock libtool to include two fixes to RPATH behaviour, as part of the solution to ensure that native binaries don't have RPATHs pointing at the host system's /usr/lib. This generally doesn't cause a problem but it can cause some binaries (such as ar) to abort on startup: ./x86_64-pokysdk-linux-ar: relocation error: /usr/lib/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference The situation here is that ar is built and as it links to the host libc/loader has an RPATH for /usr/lib. If tmp is wiped and then binutils is installed from sstate relocation occurs and the loader changed to the sysroot, but there remains a RPATH for /usr/lib. This means that the sysroot loader is used with the host libc, which can be incompatible. By telling libtool that the host library paths are in the default search path, and ensuring that all default search paths are not added as RPATHs by libtool, the result is a binary that links to what it should be linking to and nothing else. [ YOCTO #9287 ] (From OE-Core rev: 6b201081b622cc083cc2b1a8ad99d6f7d2bea480) Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Sona Sarmadi <sona.sarmadi@enea.com>
-rw-r--r--meta/recipes-devtools/binutils/binutils-2.26.inc1
-rw-r--r--meta/recipes-devtools/binutils/binutils/0014-libtool-remove-rpath.patch100
2 files changed, 101 insertions, 0 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.26.inc b/meta/recipes-devtools/binutils/binutils-2.26.inc
index 283167c..f93ded5 100644
--- a/meta/recipes-devtools/binutils/binutils-2.26.inc
+++ b/meta/recipes-devtools/binutils/binutils-2.26.inc
@@ -37,6 +37,7 @@ SRC_URI = "\
37 file://0015-allow-zero-length-elements.patch \ 37 file://0015-allow-zero-length-elements.patch \
38 file://aarch64-tls.patch \ 38 file://aarch64-tls.patch \
39 file://0015-Refine-.cfi_sections-check-to-only-consider-compact-.patch \ 39 file://0015-Refine-.cfi_sections-check-to-only-consider-compact-.patch \
40 file://0014-libtool-remove-rpath.patch \
40" 41"
41S = "${WORKDIR}/git" 42S = "${WORKDIR}/git"
42 43
diff --git a/meta/recipes-devtools/binutils/binutils/0014-libtool-remove-rpath.patch b/meta/recipes-devtools/binutils/binutils/0014-libtool-remove-rpath.patch
new file mode 100644
index 0000000..d56948f
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0014-libtool-remove-rpath.patch
@@ -0,0 +1,100 @@
1Apply these patches from our libtool patches as not only are redundant RPATHs a
2waste of space but they can cause incorrect linking when native packages are
3restored from sstate.
4
5fix-rpath.patch:
6We don't want to add RPATHS which match default linker
7search paths, they're a waste of space. This patch
8filters libtools list and removes the ones we don't need.
9
10norm-rpath.patch:
11Libtool may be passed link paths of the form "/usr/lib/../lib", which
12fool its detection code into thinking it should be included as an
13RPATH in the generated binary. Normalize before comparision.
14
15Upstream-Status: Inappropriate
16Signed-off-by: Ross Burton <ross.burton@intel.com>
17
18diff --git a/ltmain.sh b/ltmain.sh
19index 683317c..860a16a 100644
20--- a/ltmain.sh
21+++ b/ltmain.sh
22@@ -8053,8 +8053,14 @@ EOF
23 esac
24 fi
25 else
26- eval flag=\"$hardcode_libdir_flag_spec\"
27- func_append dep_rpath " $flag"
28+ # We only want to hardcode in an rpath if it isn't in the
29+ # default dlsearch path.
30+ case " $sys_lib_dlsearch_path " in
31+ *" $libdir "*) ;;
32+ *) eval flag=\"$hardcode_libdir_flag_spec\"
33+ func_append dep_rpath " $flag"
34+ ;;
35+ esac
36 fi
37 elif test -n "$runpath_var"; then
38 case "$perm_rpath " in
39@@ -8790,8 +8796,14 @@ EOF
40 esac
41 fi
42 else
43- eval flag=\"$hardcode_libdir_flag_spec\"
44- func_append rpath " $flag"
45+ # We only want to hardcode in an rpath if it isn't in the
46+ # default dlsearch path.
47+ case " $sys_lib_dlsearch_path " in
48+ *" $libdir "*) ;;
49+ *) eval flag=\"$hardcode_libdir_flag_spec\"
50+ rpath+=" $flag"
51+ ;;
52+ esac
53 fi
54 elif test -n "$runpath_var"; then
55 case "$perm_rpath " in
56@@ -8841,8 +8853,14 @@ EOF
57 esac
58 fi
59 else
60- eval flag=\"$hardcode_libdir_flag_spec\"
61- func_append rpath " $flag"
62+ # We only want to hardcode in an rpath if it isn't in the
63+ # default dlsearch path.
64+ case " $sys_lib_dlsearch_path " in
65+ *" $libdir "*) ;;
66+ *) eval flag=\"$hardcode_libdir_flag_spec\"
67+ func_append rpath " $flag"
68+ ;;
69+ esac
70 fi
71 elif test -n "$runpath_var"; then
72 case "$finalize_perm_rpath " in
73diff --git a/ltmain.sh b/ltmain.sh
74index 683317c..860a16a 100644
75--- a/ltmain.sh
76+++ b/ltmain.sh
77@@ -8055,8 +8055,10 @@ EOF
78 else
79 # We only want to hardcode in an rpath if it isn't in the
80 # default dlsearch path.
81+ func_normal_abspath "$libdir"
82+ libdir_norm=$func_normal_abspath_result
83 case " $sys_lib_dlsearch_path " in
84- *" $libdir "*) ;;
85+ *" $libdir_norm "*) ;;
86 *) eval flag=\"$hardcode_libdir_flag_spec\"
87 func_append dep_rpath " $flag"
88 ;;
89@@ -8798,8 +8800,10 @@ EOF
90 else
91 # We only want to hardcode in an rpath if it isn't in the
92 # default dlsearch path.
93+ func_normal_abspath "$libdir"
94+ libdir_norm=$func_normal_abspath_result
95 case " $sys_lib_dlsearch_path " in
96- *" $libdir "*) ;;
97+ *" $libdir_norm "*) ;;
98 *) eval flag=\"$hardcode_libdir_flag_spec\"
99 rpath+=" $flag"
100 ;;