Skip to content

Commit c7b6d38

Browse files
committed
first draft for getting debugged libc
1 parent 4c77106 commit c7b6d38

File tree

1 file changed

+64
-8
lines changed

1 file changed

+64
-8
lines changed

download

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1427
download_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

4598
if [[ $# != 1 ]]; then
4699
usage
47100
fi
48101
download_single "$1"
102+
if grep -q ubuntu <<< "$1"; then
103+
download_source "$1"
104+
fi

0 commit comments

Comments
 (0)