| #!/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 |