1#!/bin/bash
2
3# Debuglink tests.
4# We build crates/debuglink and then move its debuginfo around
5# and test that it can still find the debuginfo.
6
7set -ex
8
9cratedir=`pwd`/crates/debuglink
10exefile=crates/debuglink/target/debug/debuglink
11
12# Baseline; no separate debug
13cargo build --manifest-path crates/debuglink/Cargo.toml
14$exefile $cratedir
15
16# Separate debug in same dir
17debugfile1=`dirname $exefile`/debuglink.debug
18objcopy --only-keep-debug $exefile $debugfile1
19strip -g $exefile
20(cd `dirname $exefile` && objcopy --add-gnu-debuglink=debuglink.debug debuglink)
21$exefile $cratedir
22
23# Separate debug in .debug subdir
24debugfile2=`dirname $exefile`/.debug/debuglink.debug
25mkdir -p `dirname $debugfile2`
26mv $debugfile1 $debugfile2
27$exefile $cratedir
28
29# Separate debug in /usr/lib/debug subdir
30debugfile3="/usr/lib/debug/$cratedir/target/debug/debuglink.debug"
31mkdir -p `dirname $debugfile3`
32mv $debugfile2 $debugfile3
33$exefile $cratedir
34
35# Separate debug in /usr/lib/debug/.build-id subdir
36id=`readelf -n $exefile | grep '^    Build ID: [0-9a-f]' | cut -b 15-`
37idfile="/usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug"
38mkdir -p `dirname $idfile`
39mv $debugfile3 $idfile
40$exefile $cratedir
41
42# Replace idfile with a symlink (this is the usual arrangement)
43mv $idfile $debugfile3
44ln -s $debugfile3 $idfile
45$exefile $cratedir
46
47# Supplementary object file using relative path
48dwzfile="/usr/lib/debug/.dwz/debuglink.debug"
49mkdir -p `dirname $dwzfile`
50cp $debugfile3 $debugfile3.copy
51dwz -m $dwzfile -rh $debugfile3 $debugfile3.copy
52rm $debugfile3.copy
53$exefile $cratedir
54
55# Supplementary object file using build ID
56dwzid=`readelf -n $dwzfile | grep '^    Build ID: [0-9a-f]' | cut -b 15-`
57dwzidfile="/usr/lib/debug/.build-id/${dwzid:0:2}/${dwzid:2}.debug"
58mkdir -p `dirname $dwzidfile`
59mv $dwzfile $dwzidfile
60$exefile $cratedir
61mv $dwzidfile $dwzfile
62
63# Missing debug should fail
64mv $debugfile3 $debugfile3.tmp
65! $exefile $cratedir
66mv $debugfile3.tmp $debugfile3
67
68# Missing dwz should fail
69mv $dwzfile $dwzfile.tmp
70! $exefile $cratedir
71mv $dwzfile.tmp $dwzfile
72
73# Cleanup
74rm $idfile $debugfile3 $dwzfile
75echo Success
76