mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

65 lines
1.8 KiB

export irfs_libexec_functions=1
# find dynamic (share library) dependencies for a binary
# honors $rootdir and emulates sort of chroot therin
needed_libs() {
local x y z library libqueue liblist libdirs
# be sure to favor the 64bit locations
libdirs="$rootdir/lib64 $rootdir/usr/lib64 $rootdir/lib"
for N in `sed -e"s,^,${rootdir}," ${rootdir}/etc/ld.so.conf | tr '\n' ' '` ; do
[ -d "$N" ] && libdirs="$libdirs $N"
done
libqueue="$( mktemp -t libqueue-XXXXXX )"
liblist="$( mktemp -d -t liblist-XXXXXX )"
# initialize the queue with $*
for x ; do
echo "$rootdir/$x"
done > "$libqueue"
# get the required libraries of each file
while read y ; do
${cross_compile}readelf -d "${y}" 2>/dev/null | grep "(NEEDED)" |
sed -e "s,.*Shared library: \[\(.*\)\],\1," |
while read library ; do
[ -e "$liblist/$library" ] && continue
# use the first library with this name
find -L ${libdirs} -maxdepth 1 -name "${library}" 2>/dev/null |
head -n1 |
while read z ; do
# put the libraries found into the queue, because they might
# require other libraries themselves
echo "$z" >> "$libqueue"
echo "$z" | sed -e"s,^${rootdir},,"
done
# list this library as processed
touch "$liblist/$library"
done
done < "$libqueue"
rm -f "$libqueue" ; rm -rf "$liblist"
}
# add a file ($1) to the contents-list of initramfs
# optionally you can give a different destination filename
# in $2
# the output is a gen_init_cpio compatible list including all
# dynamic dependencies and the file itself.
add_with_deps() {
srcname=$1 ; shift
dstname=$srcname
[ -n "$1" ] && dstname=$1
echo "file $dstname $rootdir/$srcname 755 0 0"
needed_libs $srcname | while read lib
do
echo "file $lib $rootdir/$lib 755 0 0"
done
}
export -f needed_libs
export -f add_with_deps