aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2016-09-26 17:25:26 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-09-28 10:15:01 +0100
commit6779990021530129a78eb73db122e3976f687c7e (patch)
tree37a7a750c67244ba83b54a7a0a0fbf879710cbdf
parent4202a09dece07c0d3f654c2b1ae504a031b4ee90 (diff)
downloadopenembedded-core-6779990021530129a78eb73db122e3976f687c7e.tar.gz
prelink: Manipulate library paths to match the target system library setup
Currently, prelink doesn't work unless base_libdir/libdir match its hardcoded values. This patch manipulates those paths so that they match the values set in the variables and handles multilib configurations too. The manipulations only happen in the target case, if needed. [YOCTO #10282] Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/prelink/prelink_git.bb93
1 files changed, 93 insertions, 0 deletions
diff --git a/meta/recipes-devtools/prelink/prelink_git.bb b/meta/recipes-devtools/prelink/prelink_git.bb
index 5d9f260f85..0856b1c667 100644
--- a/meta/recipes-devtools/prelink/prelink_git.bb
+++ b/meta/recipes-devtools/prelink/prelink_git.bb
@@ -44,6 +44,99 @@ BBCLASSEXTEND = "native"
EXTRA_OECONF = "--disable-selinux --with-pkgversion=${PV}-${PR} \
--with-bugurl=http://bugzilla.yoctoproject.org/"
+
+#
+# For target prelink we need to ensure paths match the lib path layout
+# including for any configured multilibs
+#
+python do_linkerpaths () {
+ values = all_multilib_tune_list(["TUNE_ARCH", "baselib", "ABIEXTENSION"], d)
+
+ arches = values["TUNE_ARCH"]
+ baselibs = values["baselib"]
+ abis = values["ABIEXTENSION"]
+
+ def replace_lines(f, search, replacement, d, firstonly = False, secondonly = False):
+ f = d.expand(f)
+ if search == replacement:
+ return
+ bb.debug(2, "Replacing %s with %s in %s" % (search, replacement, f))
+ with open(f, "r") as data:
+ lines = data.readlines()
+ with open(f, "w") as data:
+ for line in lines:
+ if not secondonly and not firstonly:
+ line = line.replace(search, replacement)
+ elif secondonly and search in line:
+ secondonly = False
+ elif firstonly and search and search in line:
+ line = line.replace(search, replacement)
+ search = None
+ data.write(line)
+
+ def replace_lines_rtld(f, search, replacement, section, d):
+ f = d.expand(f)
+ bb.debug(2, "Replacing %s with %s in %s" % (search, replacement, f))
+ with open(f, "r") as data:
+ lines = data.readlines()
+ found = False
+ found2 = False
+ with open(f, "w") as data:
+ for line in lines:
+ if section in line:
+ if section == "else" and "if" in line:
+ found = False
+ else:
+ found = True
+ if found and "dst_LIB =" in line:
+ found2 = True
+ elif "}" in line:
+ found = False
+ found2 = False
+ if found2:
+ line = line.replace(search, replacement)
+ data.write(line)
+
+ for i, arch in enumerate(arches):
+ tune_baselib = baselibs[i]
+ abi = abis[i]
+
+ bits = 32
+ if arch == "powerpc":
+ replace_lines("${S}/src/arch-ppc.c", "/lib/ld.so.1", "/" + tune_baselib + "/ld.so.1", d)
+ elif arch == "powerpc64":
+ replace_lines("${S}/src/arch-ppc64.c", "/lib64/ld64.so.1", "/" + tune_baselib + "/ld64.so.1", d)
+ bits = 64
+ elif arch == "x86_64":
+ if abi == "x32":
+ replace_lines("${S}/src/arch-x86_64.c", "/libx32/ld-linux-x32.so.2", "/" + tune_baselib + "/ld-linux-x32.so.2", d)
+ else:
+ replace_lines("${S}/src/arch-x86_64.c", "/lib64/ld-linux-x86-64.so.2", "/" + tune_baselib + "/ld-linux-x86-64.so.2", d)
+ bits = 64
+ elif arch == "arm":
+ replace_lines("${S}/src/arch-arm.c", "/lib/ld-linux.so.3", "/" + tune_baselib + "/ld-linux.so.3", d)
+ replace_lines("${S}/src/arch-arm.c", "/lib/ld-linux-armhf.so.3", "/" + tune_baselib + "/ld-linux-armhf.so.3", d)
+ elif arch == "mips" or arch == "mipsel":
+ replace_lines("${S}/src/arch-mips.c", "/lib/ld.so.1", "/" + tune_baselib + "/ld.so.1", d, firstonly=True)
+ replace_lines("${S}/src/arch-mips.c", "/lib32/ld.so.1", "/" + tune_baselib + "/ld.so.1", d)
+ elif arch == "mips64" or arch == "mips64el":
+ replace_lines("${S}/src/arch-mips.c", "/lib/ld.so.1", "/" + tune_baselib + "/ld.so.1", d, secondonly=True)
+ replace_lines("${S}/src/arch-mips.c", "/lib64/ld.so.1", "/" + tune_baselib + "/ld.so.1", d)
+ bits = 64
+ elif arch.endswith("86"):
+ replace_lines("${S}/src/arch-i386.c", "/lib/ld-linux.so.2", "/" + tune_baselib + "/ld-linux.so.2", d)
+ if bits == 32 and tune_baselib != "lib":
+ replace_lines_rtld("${S}/src/rtld/rtld.c", "lib", tune_baselib, "else", d)
+ if bits == 64 and tune_baselib != "lib64":
+ replace_lines_rtld("${S}/src/rtld/rtld.c", "lib64", tune_baselib, "use_64bit", d)
+}
+
+python () {
+ overrides = d.getVar("OVERRIDES", True).split(":")
+ if "class-target" in overrides:
+ bb.build.addtask('do_linkerpaths', 'do_configure', 'do_patch', d)
+}
+
do_configure_prepend () {
# Disable documentation!
echo "all:" > ${S}/doc/Makefile.am