@@ -11,6 +11,19 @@ usage() {
1111 exit 2
1212}
1313
14+ extract_package (){
15+ # expect: url
16+ # result: package from url is extracted into $tmp. runtime is cd'd into $tmp; caller expected to popd out.
17+ echo " -> Location: $1 "
18+ local tmp=` mktemp -d`
19+ echo " -> Downloading package"
20+ wget " $1 " 2> /dev/null -O " $tmp /pkg.deb" || die " Failed to download package from $1 "
21+ echo " -> Extracting package"
22+
23+ pushd " $tmp " 1> /dev/null
24+ ar x pkg.deb || die " ar failed"
25+ }
26+
1427download_single () {
1528 local id=$1
1629 echo " Getting $id "
@@ -23,26 +36,69 @@ download_single() {
2336 fi
2437
2538 local url=" $( cat " db/$1 .url" ) "
26- echo " -> Location: $url "
27- local tmp=` mktemp -d`
28- echo " -> Downloading package"
29- wget " $url " 2> /dev/null -O $tmp /pkg.deb || die " Failed to download package from $url "
30- echo " -> Extracting package"
31-
32- pushd $tmp 1> /dev/null
33- ar x pkg.deb || die " ar failed"
39+ extract_package " $url "
3440 tar xf data.tar.* || die " tar failed"
41+ local tmp=" $PWD "
3542 popd 1> /dev/null
3643
3744 mkdir libs/$id
3845 cp $tmp /lib/* /* libs/$id 2> /dev/null || cp $tmp /lib32/* libs/$id 2> /dev/null \
3946 || die " Failed to save. Check it manually $tmp "
4047 echo " -> Package saved to libs/$id "
4148
49+ [ -z " $tmp " ] && die ' !! $tmp was null !!'
4250 rm -rf $tmp
4351}
52+ download_source () {
53+ # expect: id (e.g. libc6_2.15-0ubuntu10.18_amd64)
54+ # result: downloads source files & debug .so files
55+ # stored at ./libs/$orig_id/(debug|source).
56+ local orig_id=" $1 "
57+ local trimmed_id=" $( grep -o ' _.*' <<< " $1" ) " # id without the pkgname
58+ local ver=" $( sed ' s/_\(2\.[0-9]*\).*/\1/' <<< " $trimmed_id" ) " # e.g. "2.15"
59+ local source_id=" glibc-source$( sed ' s/[0-9a-z]*$/all/' <<< " $trimmed_id" ) " # need to replace _(amd64|i386|...) with _all
60+ local debug_id=" libc6-dbg$trimmed_id "
61+
62+ echo " Getting debug materials for $orig_id "
63+ if [ -d " libs/$orig_id /source" ] || [ -d " libs/$orig_id /debug" ]; then
64+ die " --> Downloaded before. Remove 'libs/$orig_id /source' to download again."
65+ fi
66+
67+ local urlbase=" $( grep -o ' .*/' " db/$orig_id .url" ) "
68+ local source_url=" $( sed ' s/main/universe/' <<< " $urlbase" ) $source_id .deb"
69+ local debug_url=" $urlbase$debug_id .deb"
70+
71+ # get sources
72+ extract_package " $source_url "
73+ tar --wildcards -xf data.tar.* " ./usr/src/glibc/glibc-*" || die " tar failed"
74+ tar xf ./usr/src/glibc/glibc-* || die " tar failed"
75+ local tmp=" $PWD "
76+ popd 1> /dev/null
77+
78+ mkdir " libs/$orig_id /source"
79+ mv " $tmp /glibc-$ver " " libs/$orig_id /source"
80+ [ -z " $tmp " ] && die ' !! $tmp was null !!'
81+ rm -rf " $tmp "
82+
83+ # get debug symbols
84+ extract_package " $debug_url "
85+ tar xf data.tar.* || die " tar failed"
86+ local tmp=" $PWD "
87+ popd 1> /dev/null
88+
89+ mkdir " libs/$orig_id /debug"
90+ mv " $tmp /usr/lib/debug/lib" " $tmp /lib" # /lib should not exist
91+ cp $tmp /lib/* /* libs/$orig_id /debug 2> /dev/null || cp $tmp /lib32/* libs/$orig_id /debug 2> /dev/null \
92+ || die " Failed to save. Check it manually $tmp "
93+ ln libs/$orig_id /debug/libc-$ver .so libs/$orig_id /debug/libc.so.6
94+ [ -z " $tmp " ] && die ' !! $tmp was null !!'
95+ rm -rf " $tmp "
96+ }
4497
4598if [[ $# != 1 ]]; then
4699 usage
47100fi
48101download_single " $1 "
102+ if grep -q ubuntu <<< " $1" ; then
103+ download_source " $1 "
104+ fi
0 commit comments