| #!/bin/bash |
| |
| # Debuglink tests. |
| # We build crates/debuglink and then move its debuginfo around |
| # and test that it can still find the debuginfo. |
| |
| set -ex |
| |
| cratedir=`pwd`/crates/debuglink |
| exefile=crates/debuglink/target/debug/debuglink |
| |
| # Baseline; no separate debug |
| cargo build --manifest-path crates/debuglink/Cargo.toml |
| $exefile $cratedir |
| |
| # Separate debug in same dir |
| debugfile1=`dirname $exefile`/debuglink.debug |
| objcopy --only-keep-debug $exefile $debugfile1 |
| strip -g $exefile |
| (cd `dirname $exefile` && objcopy --add-gnu-debuglink=debuglink.debug debuglink) |
| $exefile $cratedir |
| |
| # Separate debug in .debug subdir |
| debugfile2=`dirname $exefile`/.debug/debuglink.debug |
| mkdir -p `dirname $debugfile2` |
| mv $debugfile1 $debugfile2 |
| $exefile $cratedir |
| |
| # Separate debug in /usr/lib/debug subdir |
| debugfile3="/usr/lib/debug/$cratedir/target/debug/debuglink.debug" |
| mkdir -p `dirname $debugfile3` |
| mv $debugfile2 $debugfile3 |
| $exefile $cratedir |
| |
| # Separate debug in /usr/lib/debug/.build-id subdir |
| id=`readelf -n $exefile | grep '^ Build ID: [0-9a-f]' | cut -b 15-` |
| idfile="/usr/lib/debug/.build-id/${id:0:2}/${id:2}.debug" |
| mkdir -p `dirname $idfile` |
| mv $debugfile3 $idfile |
| $exefile $cratedir |
| |
| # Replace idfile with a symlink (this is the usual arrangement) |
| mv $idfile $debugfile3 |
| ln -s $debugfile3 $idfile |
| $exefile $cratedir |
| |
| # Supplementary object file using relative path |
| dwzfile="/usr/lib/debug/.dwz/debuglink.debug" |
| mkdir -p `dirname $dwzfile` |
| cp $debugfile3 $debugfile3.copy |
| dwz -m $dwzfile -rh $debugfile3 $debugfile3.copy |
| rm $debugfile3.copy |
| $exefile $cratedir |
| |
| # Supplementary object file using build ID |
| dwzid=`readelf -n $dwzfile | grep '^ Build ID: [0-9a-f]' | cut -b 15-` |
| dwzidfile="/usr/lib/debug/.build-id/${dwzid:0:2}/${dwzid:2}.debug" |
| mkdir -p `dirname $dwzidfile` |
| mv $dwzfile $dwzidfile |
| $exefile $cratedir |
| mv $dwzidfile $dwzfile |
| |
| # Missing debug should fail |
| mv $debugfile3 $debugfile3.tmp |
| ! $exefile $cratedir |
| mv $debugfile3.tmp $debugfile3 |
| |
| # Missing dwz should fail |
| mv $dwzfile $dwzfile.tmp |
| ! $exefile $cratedir |
| mv $dwzfile.tmp $dwzfile |
| |
| # Cleanup |
| rm $idfile $debugfile3 $dwzfile |
| echo Success |