Browse Source

[PATCH 21/50] Simplified get_dso_deps

This takes advantage of several bash specific constructs to make
get_dso_deps easier to read and understand.
master
Victor Lowther 16 years ago committed by Dave Jones
parent
commit
8667f2b733
  1. 83
      dracut-functions

83
dracut-functions

@ -21,73 +21,42 @@
# Peter Jones <pjones@redhat.com> # Peter Jones <pjones@redhat.com>
# Jeremy Katz <katzj@redhat.com> # Jeremy Katz <katzj@redhat.com>
# Jakub Jelinek <jakub@redhat.com> # Jakub Jelinek <jakub@redhat.com>
#
#


IF_RTLD="" IF_RTLD=""
IF_dynamic="" IF_dynamic=""
get_dso_deps() { get_dso_deps() {
local bin="$1" ; shift local bin="$1" ; shift
local FILES=() LDSO NAME IO FILE ADDR I1 n f TLIBDIR


declare -a FILES LDSO=$(LANG=C eu-readelf -l $bin 2>/dev/null | \
declare -a NAMES awk '/interpreter/ {print $4}' |sed -e 's/]$//')

[[ $LDSO && $LDSO != $bin ]] || LDSO="$IF_RTLD"
local LDSO=$(LANG=C eu-readelf -l $bin 2>/dev/null |grep interpreter |awk {'print $4;'} |sed -e 's/]$//') [[ $LDSO && $LDSO != $bin ]] || return 1
[ -z "$LDSO" -o "$LDSO" == "$bin" ] && local LDSO="$IF_RTLD" [[ $IF_RTLD ]] || IF_RTLD="$LDSO"
[ -z "$LDSO" -o "$LDSO" == "$bin" ] && return 1
[ -z "$IF_RTLD" ] && IF_RTLD="$LDSO"


# I hate shell. # I love bash!
declare -i n=0
while read NAME I0 FILE ADDR I1 ; do while read NAME I0 FILE ADDR I1 ; do
[ "$FILE" == "not" ] && FILE="$FILE $ADDR" [[ $FILE = $bin ]] && continue
[ "$NAME" == "not" ] && NAME="$NAME $I0" [[ $FILE = not || $NAME = not ]] && {
NAMES[$n]="$NAME" echo "Missing a shared library required by $bin." >&2
FILES[$n]="$FILE" echo "dracut cannot create an initrd." >&2
let n++
done << EOF
$(LD_TRACE_PRELINKING=1 LD_WARN= LD_TRACE_LOADED_OBJECTS=1 \
$LDSO $bin 2>/dev/null)
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
local FILE="${FILES[$n]}"
local NAME="${NAMES[$n]}"
if [ "$FILE" == "not found" -o "$NAME" == "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
return 1 return 1
fi }
case "$FILE" in # see if we are loading an optimized version of a shared lib.
/lib*) [[ $FILE =~ '(/lib[^/]*).*' ]] && {
TLIBDIR=`echo "$FILE" | sed 's,\(/lib[^/]*\)/.*$,\1,'` TLIBDIR=${BASH_REMATCH[1]}
BASE=`basename "$FILE"` BASE="${FILE##*/}"
# Prefer nosegneg libs over direct segment accesses on i686. # prefer nosegneg libs, then unoptimized ones.
if [ -f "$TLIBDIR/i686/nosegneg/$BASE" ]; then for f in "$TLIBDIR/i686/nosegneg" "$TLIBDIR"; do
FILE="$TLIBDIR/i686/nosegneg/$BASE" [[ -f $f/$BASE ]] || continue
# Otherwise, prefer base libraries rather than their optimized FILE="$f/$BASE"
# variants. break
elif [ -f "$TLIBDIR/$BASE" ]; then
FILE="$TLIBDIR/$BASE"
fi
FILES[$n]="$FILE"
;;
esac
IF_dynamic="yes"
let n++
done done
IF_dynamic="yes"
}
FILES+=("$FILE")
done < <(LD_TRACE_PRELINKING=1 LD_WARN= LD_TRACE_LOADED_OBJECTS=1 \
$LDSO $bin 2>/dev/null)


echo "${FILES[@]}" echo "${FILES[@]}"
} }

Loading…
Cancel
Save