summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Nottingham <notting@redhat.com>2007-12-19 14:58:49 -0500
committerBill Nottingham <notting@redhat.com>2007-12-19 14:58:49 -0500
commitc893c7849173cc7890bd9e4b9bb62e83296c9aa7 (patch)
tree199f57efe147bc8f4b3f4e18816ce9f1c249546a
parentd209bc9a3dadcc666fd365f431eb40bce5e75e66 (diff)
downloadanaconda-c893c7849173cc7890bd9e4b9bb62e83296c9aa7.tar.gz
anaconda-c893c7849173cc7890bd9e4b9bb62e83296c9aa7.tar.xz
anaconda-c893c7849173cc7890bd9e4b9bb62e83296c9aa7.zip
Add buildinstall.functions (DSO dependency finding)
-rwxr-xr-xscripts/buildinstall.functions120
1 files changed, 120 insertions, 0 deletions
diff --git a/scripts/buildinstall.functions b/scripts/buildinstall.functions
new file mode 100755
index 000000000..fcc4e46cc
--- /dev/null
+++ b/scripts/buildinstall.functions
@@ -0,0 +1,120 @@
+#!/bin/bash
+
+# pulled right out of mkinitrd....
+DSO_DEPS=""
+LDSO=""
+get_dso_deps() {
+ root="$1" ; shift
+ bin="$1" ; shift
+ DSO_DEPS=""
+
+ declare -a FILES
+ declare -a NAMES
+
+ # this is a hack, but the only better way requires binutils or elfutils
+ # be installed. i.e., we need readelf to find the interpretter.
+ if [ -z "$LDSO" ]; then
+ for ldso in $root/lib*/ld*.so* ; do
+ [ -L $ldso ] && continue
+ [ -x $ldso ] || continue
+ $ldso --verify $bin >/dev/null 2>&1 || continue
+ LDSO=$(echo $ldso |sed -e "s,$root,,")
+ done
+ fi
+
+ # I still hate shell.
+ declare -i n=0
+ while read NAME I0 FILE ADDR I1 ; do
+ [ "$FILE" == "not" ] && FILE="$FILE $ADDR"
+ NAMES[$n]="$NAME"
+ FILES[$n]="$FILE"
+ let n++
+ done << EOF
+ $(chroot $root env LD_TRACE_PRELINKING=1 LD_WARN= \
+ LD_TRACE_LOADED_OBJECTS=1 $LDSO $bin)
+EOF
+
+ [ ${#FILES[*]} -eq 0 ] && return 1
+
+ # we don't want the name of the binary in the list
+ if [ "${FILES[0]}" == "$bin" ]; then
+ FILES[0]=""
+ NAMES[0]=""
+ [ ${#FILES[*]} -eq 1 ] && return 1
+ fi
+
+ declare -i n=0
+ while [ $n -lt ${#FILES[*]} ]; do
+ FILE="${FILES[$n]}"
+ if [ "$FILE" == "not found" ]; then
+ cat 1>&2 <<EOF
+There are missing files on your system. The dynamic object $bin
+requires ${NAMES[$n]} n order to properly function. mkinitrd cannot continue.
+EOF
+ exit 1
+ fi
+ case "$FILE" in
+ /lib*)
+ TLIBDIR=`echo "$FILE" | sed 's,\(/lib[^/]*\)/.*$,\1,'`
+ BASE=`basename "$FILE"`
+ # Prefer nosegneg libs over direct segment accesses on i686.
+ if [ -f "$TLIBDIR/i686/nosegneg/$BASE" ]; then
+ FILE="$TLIBDIR/i686/nosegneg/$BASE"
+ # Otherwise, prefer base libraries rather than their optimized
+ # variants.
+ elif [ -f "$TLIBDIR/$BASE" ]; then
+ FILE="$TLIBDIR/$BASE"
+ fi
+ ;;
+ esac
+ dynamic="yes"
+ let n++
+ done
+
+ DSO_DEPS="${FILES[@]}"
+
+ for l in $(chroot $root find /lib* -maxdepth 1 -type l -name ld*.so*); do
+ [ "$(chroot $root readlink -f $l)" == "$LDSO" ] && DSO_DEPS="$DSO_DEPS $l"
+ done
+
+ [ -n "$DEBUG" ] && echo "DSO_DEPS for $bin are $DSO_DEPS"
+}
+
+instFile() {
+ FILE=$1
+ DESTROOT=$2
+
+ [ -n "$DEBUG" ] && echo "Installing $FILE"
+ if [ -e $DESTROOT/$FILE -o -L $DESTROOT/$FILE ]; then
+ return
+ elif [ ! -d $DESTROOT/`dirname $FILE` ]; then
+ mkdir -p $DESTROOT/`dirname $FILE`
+ fi
+ if [ -L $FILE ]; then
+ cp -al $FILE $DESTROOT/`dirname $FILE`
+ instFile ./`dirname $FILE`/`readlink $FILE` $DESTROOT
+ return
+ else
+ cp -aL $FILE $DESTROOT/`dirname $FILE`
+ fi
+
+ file $FILE | grep -q ": ELF" && {
+ get_dso_deps $(pwd) "$FILE"
+ local DEPS="$DSO_DEPS"
+ for x in $DEPS ; do
+ instFile ./$x $DESTROOT
+ done
+ }
+}
+
+instDir() {
+ DIR=$1
+ DESTROOT=$2
+
+ [ -n "$DEBUG" ] && echo "Installing $DIR"
+ if [ -d $DESTROOT/$DIR -o -h $DESTROOT/$DIR ]; then
+ return
+ fi
+ cp -a --parents $DIR $DESTROOT/
+}
+