diff options
Diffstat (limited to 'poky/meta/recipes-devtools/prelink')
5 files changed, 263 insertions, 0 deletions
diff --git a/poky/meta/recipes-devtools/prelink/prelink/macros.prelink b/poky/meta/recipes-devtools/prelink/prelink/macros.prelink new file mode 100644 index 000000000..cb1669588 --- /dev/null +++ b/poky/meta/recipes-devtools/prelink/prelink/macros.prelink @@ -0,0 +1,5 @@ +# rpm-4.1 verifies prelinked libraries using a prelink undo helper. +# Note: The 2nd token is used as argv[0] and "library" is a +# placeholder that will be deleted and replaced with the appropriate +# library file path. +%__prelink_undo_cmd /usr/sbin/prelink prelink -y library diff --git a/poky/meta/recipes-devtools/prelink/prelink/prelink.conf b/poky/meta/recipes-devtools/prelink/prelink/prelink.conf new file mode 100644 index 000000000..562f23c59 --- /dev/null +++ b/poky/meta/recipes-devtools/prelink/prelink/prelink.conf @@ -0,0 +1,18 @@ +# This config file contains a list of directories both with binaries +# and libraries prelink should consider by default. +# If a directory name is prefixed with `-l ', the directory hierarchy +# will be walked as long as filesystem boundaries are not crossed. +# If a directory name is prefixed with `-h ', symbolic links in a +# directory hierarchy are followed. +-l /usr/local/sbin +-l /sbin +-l /usr/sbin +-l /usr/local/bin +-l /bin +-l /usr/bin +-l /usr/X11R6/bin +-l /usr/games +-l /usr/local/lib{,32,64,x32} +-l /lib{,32,64,x32} +-l /usr/lib{,32,64,x32} +-l /usr/X11R6/lib{,32,64,x32} diff --git a/poky/meta/recipes-devtools/prelink/prelink/prelink.cron.daily b/poky/meta/recipes-devtools/prelink/prelink/prelink.cron.daily new file mode 100644 index 000000000..0b3c07322 --- /dev/null +++ b/poky/meta/recipes-devtools/prelink/prelink/prelink.cron.daily @@ -0,0 +1,40 @@ +#!/bin/sh + +. /etc/default/prelink + +renice +19 -p $$ >/dev/null 2>&1 + +if [ "$PRELINKING" != yes ]; then + if [ -f /etc/prelink.cache ]; then + echo /usr/sbin/prelink -uav > /var/log/prelink.log + /usr/sbin/prelink -uav >> /var/log/prelink.log 2>&1 + rm -f /etc/prelink.cache + # Restart init if needed + [ -n "$(find `ldd /sbin/init | awk '{ print $3 }'` /sbin/init -ctime -1 2>/dev/null )" ] && /sbin/telinit u + fi + exit 0 +fi + +if [ ! -f /etc/prelink.cache -o -f /var/lib/misc/prelink.force ] \ + || grep -q '^prelink-ELF0.[0-2]' /etc/prelink.cache; then + # If cache does not exist or is from older prelink versions or + # if we were asked to explicitely, force full prelinking + rm -f /etc/prelink.cache /var/lib/misc/prelink.force + PRELINK_OPTS="$PRELINK_OPTS -f" + date > /var/lib/misc/prelink.full +elif [ -n "$PRELINK_FULL_TIME_INTERVAL" \ + -a "`find /var/lib/misc/prelink.full -mtime -${PRELINK_FULL_TIME_INTERVAL} 2>/dev/null`" \ + = /var/lib/misc/prelink.full ]; then + # If prelink without -q has been run in the last + # PRELINK_FULL_TIME_INTERVAL days, just use quick mode + PRELINK_OPTS="$PRELINK_OPTS -q" +else + date > /var/lib/misc/prelink.full +fi + +echo /usr/sbin/prelink -av $PRELINK_OPTS > /var/log/prelink.log +/usr/sbin/prelink -av $PRELINK_OPTS >> /var/log/prelink.log 2>&1 +# Restart init if needed +[ -n "$(find `ldd /sbin/init | awk '{ print $3 }'` /sbin/init -ctime -1 2>/dev/null )" ] && /sbin/telinit u + +exit 0 diff --git a/poky/meta/recipes-devtools/prelink/prelink/prelink.default b/poky/meta/recipes-devtools/prelink/prelink/prelink.default new file mode 100644 index 000000000..d8802f820 --- /dev/null +++ b/poky/meta/recipes-devtools/prelink/prelink/prelink.default @@ -0,0 +1,22 @@ +# Set this to no to disable prelinking altogether +# or to yes to enable it. +# (if you change this from yes to no prelink -ua +# will be run next night to undo prelinking) +PRELINKING=yes + +# Options to pass to prelink +# -m Try to conserve virtual memory by allowing overlapping +# assigned virtual memory slots for libraries which +# never appear together in one binary +# -R Randomize virtual memory slot assignments for libraries. +# This makes it slightly harder for various buffer overflow +# attacks, since library addresses will be different on each +# host using -R. +PRELINK_OPTS=-mR + +# How often should full prelink be run (in days) +# Normally, prelink will be run in quick mode, every +# $PRELINK_FULL_TIME_INTERVAL days it will be run +# in normal mode. Comment this line out if prelink +# should be run in normal mode always. +PRELINK_FULL_TIME_INTERVAL=14 diff --git a/poky/meta/recipes-devtools/prelink/prelink_git.bb b/poky/meta/recipes-devtools/prelink/prelink_git.bb new file mode 100644 index 000000000..0f6d16e00 --- /dev/null +++ b/poky/meta/recipes-devtools/prelink/prelink_git.bb @@ -0,0 +1,178 @@ +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" +HOMEPAGE = "http://git.yoctoproject.org/cgit.cgi/prelink-cross/about/" +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 = "05aeafd053e56356ec8c62f4bb8f7b95bae192f3" +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" +UPSTREAM_CHECK_COMMITS = "1" + +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").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 ae doing a cross install, we want to avoid prelinking. +# Prelinking during a cross install should be handled by the image-prelink +# bbclass. If the user desires this to run on the target at first boot +# they will need to create a custom boot script. +pkg_postinst_prelink() { +#!/bin/sh + +if [ "x$D" != "x" ]; then + exit 0 +fi + +prelink -a +} + +pkg_prerm_prelink() { +#!/bin/sh + +if [ "x$D" != "x" ]; then + exit 1 +fi + +prelink -au +} + |