]> code.ossystems Code Review - openembedded-core.git/commitdiff
prelink: Manipulate library paths to match the target system library setup
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 26 Sep 2016 16:25:26 +0000 (17:25 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 28 Sep 2016 09:15:01 +0000 (10:15 +0100)
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>
meta/recipes-devtools/prelink/prelink_git.bb

index 5d9f260f85c5b2303f92e3662206c7c036885ea3..0856b1c6675a2765e5f7567b5bf134e5412dbdbc 100644 (file)
@@ -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