--- /dev/null
+#!/bin/sh
+
+set -e
+tmpdir=/tmp/fixlib$$
+trap 'rm -rf "$tmpdir"' 0 1 2 3 15
+mkdir -p "$tmpdir"
+
+if [ $# -lt 3 ]; then
+ echo >&2 "Usage: $0 srclib destlib library ..."
+ exit 1
+fi
+
+: ${READELF=readelf}
+
+srclib="$1"
+destlib="$2"
+shift
+shift
+rm -f "$tmpdir"/todo
+touch "$tmpdir"/todo
+for lib; do
+ echo "$lib" >> "$tmpdir"/todo
+done
+
+process()
+{
+ libname="$1"
+ libfile="$destlib"/"$libname"
+ if [ ! -f "$libfile" ]; then
+ echo >&2 "$libfile not found"
+ exit 1
+ fi
+ "$READELF" -d "$libfile" | awk '$1=="0x00000001" {print $NF}' | tr -d '][' | grep '\.so\.' | sort >> "$tmpdir"/worklist
+}
+
+install()
+{
+ libname="$1"
+ libfile=`echo "$libname" | sed -e 's/\.so\..*/.so/'`
+ cp "$srclib"/"$libname" "$destlib"/"$libfile"
+ echo "$libfile" >> "$tmpdir"/worklist
+ for deplib in `"$READELF" -d "$destlib"/"$libfile" | awk '$1=="0x00000001" {print $NF}' | tr -d '][' | grep '\.so\.' | sort`; do
+ echo "$deplib $libname" >> "$tmpdir"/liblist
+ done
+}
+
+rm -f "$tmpdir"/liblist
+touch "$tmpdir"/liblist
+sort "$tmpdir"/todo > "$tmpdir"/processed
+while [ -s "$tmpdir"/todo ]; do
+ rm -f "$tmpdir"/worklist
+ touch "$tmpdir"/worklist
+ cat "$tmpdir"/todo | while read lib; do
+ if [ ! -z "$lib" ]; then
+ process "$lib"
+ fi
+ done
+ sort "$tmpdir"/worklist | uniq > "$tmpdir"/todo.tmp
+ comm -13 "$tmpdir"/processed "$tmpdir"/todo.tmp > "$tmpdir"/todo
+ sort -m "$tmpdir"/processed "$tmpdir"/todo | uniq > "$tmpdir"/processed.tmp
+ mv "$tmpdir"/processed.tmp "$tmpdir"/processed
+ rm -f "$tmpdir"/worklist
+ touch "$tmpdir"/worklist
+ cat "$tmpdir"/todo | while read lib; do
+ if [ ! -z "$lib" ]; then
+ install "$lib"
+ fi
+ done
+ mv "$tmpdir"/worklist "$tmpdir"/todo
+done
+tsort "$tmpdir"/liblist