[gnome-continuous-yocto/gnomeostree-3.28-rocko: 2687/8267] prelink: Manipulate library paths to match the target system library setup



commit 47abf987ad3bde11d1019596a71028560535e4cc
Author: Richard Purdie <richard purdie linuxfoundation org>
Date:   Mon Sep 26 17:25:26 2016 +0100

    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]
    
    (From OE-Core rev: 6779990021530129a78eb73db122e3976f687c7e)
    
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 meta/recipes-devtools/prelink/prelink_git.bb |   93 ++++++++++++++++++++++++++
 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 5d9f260..0856b1c 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]