mirror of
https://git.yoctoproject.org/poky
synced 2026-02-24 18:39:40 +01:00
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>
175 lines
6.5 KiB
BlitzBasic
175 lines
6.5 KiB
BlitzBasic
SECTION = "devel"
|
|
# Need binutils for libiberty.a
|
|
# Would need transfig-native for documentation if it wasn't disabled
|
|
DEPENDS = "elfutils binutils"
|
|
SUMMARY = "An ELF prelinking utility"
|
|
DESCRIPTION = "The prelink package contains a utility which modifies ELF shared libraries \
|
|
and executables, so that far fewer relocations need to be resolved at \
|
|
runtime and thus programs come up faster."
|
|
LICENSE = "GPLv2"
|
|
LIC_FILES_CHKSUM = "file://COPYING;md5=c93c0550bd3173f4504b2cbd8991e50b"
|
|
SRCREV = "ef20628dd78b92e1a3123afc67b64cf010bdd9e4"
|
|
PV = "1.0+git${SRCPV}"
|
|
|
|
#
|
|
# The cron script attempts to re-prelink the system daily -- on
|
|
# systems where users are adding applications, this might be reasonable
|
|
# but for embedded, we should be re-running prelink -a after an update.
|
|
#
|
|
# Default is prelinking is enabled.
|
|
#
|
|
SUMMARY_${PN}-cron = "Cron scripts to control automatic prelinking"
|
|
DESCRIPTION_${PN}-cron = "Cron scripts to control automatic prelinking. \
|
|
See: ${sysconfdir}/cron.daily/prelink for configuration information."
|
|
|
|
FILES_${PN}-cron = "${sysconfdir}/cron.daily ${sysconfdir}/default"
|
|
|
|
PACKAGES =+ "${PN}-cron"
|
|
|
|
SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
|
|
file://prelink.conf \
|
|
file://prelink.cron.daily \
|
|
file://prelink.default \
|
|
file://macros.prelink"
|
|
|
|
TARGET_OS_ORIG := "${TARGET_OS}"
|
|
OVERRIDES_append = ":${TARGET_OS_ORIG}"
|
|
|
|
S = "${WORKDIR}/git"
|
|
|
|
inherit autotools
|
|
|
|
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
|
|
}
|
|
|
|
do_install_append () {
|
|
install -d ${D}${sysconfdir}/cron.daily ${D}${sysconfdir}/default ${D}${sysconfdir}/rpm
|
|
install -m 0644 ${WORKDIR}/prelink.conf ${D}${sysconfdir}/prelink.conf
|
|
install -m 0644 ${WORKDIR}/prelink.cron.daily ${D}${sysconfdir}/cron.daily/prelink
|
|
install -m 0644 ${WORKDIR}/prelink.default ${D}${sysconfdir}/default/prelink
|
|
install -m 0644 ${WORKDIR}/macros.prelink ${D}${sysconfdir}/rpm/macros.prelink
|
|
}
|
|
|
|
# If we're using image-prelink, we want to skip this on the host side
|
|
# but still do it if the package is installed on the target...
|
|
pkg_postinst_prelink() {
|
|
#!/bin/sh
|
|
|
|
if [ "x$D" != "x" ]; then
|
|
${@bb.utils.contains('USER_CLASSES', 'image-prelink', 'exit 0', 'exit 1', d)}
|
|
fi
|
|
|
|
prelink -a
|
|
}
|
|
|
|
pkg_prerm_prelink() {
|
|
#!/bin/sh
|
|
|
|
if [ "x$D" != "x" ]; then
|
|
exit 1
|
|
fi
|
|
|
|
prelink -au
|
|
}
|
|
|