]>
Commit | Line | Data |
---|---|---|
aef0361e MC |
1 | #!/bin/sh |
2 | ||
3 | set -e | |
4 | tmpdir=/tmp/fixlib$$ | |
5 | trap 'rm -rf "$tmpdir"' 0 1 2 3 15 | |
6 | mkdir -p "$tmpdir" | |
7 | ||
8 | if [ $# -lt 3 ]; then | |
9 | echo >&2 "Usage: $0 srclib destlib library ..." | |
10 | exit 1 | |
11 | fi | |
12 | ||
13 | : ${READELF=readelf} | |
14 | ||
15 | srclib="$1" | |
16 | destlib="$2" | |
17 | shift | |
18 | shift | |
19 | rm -f "$tmpdir"/todo | |
20 | touch "$tmpdir"/todo | |
21 | for lib; do | |
22 | echo "$lib" >> "$tmpdir"/todo | |
23 | done | |
24 | ||
25 | process() | |
26 | { | |
27 | libname="$1" | |
28 | libfile="$destlib"/"$libname" | |
29 | if [ ! -f "$libfile" ]; then | |
30 | echo >&2 "$libfile not found" | |
31 | exit 1 | |
32 | fi | |
33 | "$READELF" -d "$libfile" | awk '$1=="0x00000001" {print $NF}' | tr -d '][' | grep '\.so\.' | sort >> "$tmpdir"/worklist | |
34 | } | |
35 | ||
36 | install() | |
37 | { | |
38 | libname="$1" | |
39 | libfile=`echo "$libname" | sed -e 's/\.so\..*/.so/'` | |
40 | cp "$srclib"/"$libname" "$destlib"/"$libfile" | |
41 | echo "$libfile" >> "$tmpdir"/worklist | |
42 | for deplib in `"$READELF" -d "$destlib"/"$libfile" | awk '$1=="0x00000001" {print $NF}' | tr -d '][' | grep '\.so\.' | sort`; do | |
43 | echo "$deplib $libname" >> "$tmpdir"/liblist | |
44 | done | |
45 | } | |
46 | ||
47 | rm -f "$tmpdir"/liblist | |
48 | touch "$tmpdir"/liblist | |
49 | sort "$tmpdir"/todo > "$tmpdir"/processed | |
50 | while [ -s "$tmpdir"/todo ]; do | |
51 | rm -f "$tmpdir"/worklist | |
52 | touch "$tmpdir"/worklist | |
53 | cat "$tmpdir"/todo | while read lib; do | |
54 | if [ ! -z "$lib" ]; then | |
55 | process "$lib" | |
56 | fi | |
57 | done | |
58 | sort "$tmpdir"/worklist | uniq > "$tmpdir"/todo.tmp | |
59 | comm -13 "$tmpdir"/processed "$tmpdir"/todo.tmp > "$tmpdir"/todo | |
60 | sort -m "$tmpdir"/processed "$tmpdir"/todo | uniq > "$tmpdir"/processed.tmp | |
61 | mv "$tmpdir"/processed.tmp "$tmpdir"/processed | |
62 | rm -f "$tmpdir"/worklist | |
63 | touch "$tmpdir"/worklist | |
64 | cat "$tmpdir"/todo | while read lib; do | |
65 | if [ ! -z "$lib" ]; then | |
66 | install "$lib" | |
67 | fi | |
68 | done | |
69 | mv "$tmpdir"/worklist "$tmpdir"/todo | |
70 | done | |
71 | tsort "$tmpdir"/liblist |