1#!/bin/sh
2
3# this function is slight modification of the one used in RPM
4# found at https://bugzilla.redhat.com/show_bug.cgi?id=834073
5# written by Alexander Larsson <alexl@redhat.com>
6add_minidebug()
7{
8  debuginfo="$1" ## we don't have separate debuginfo file
9  binary="$1"
10
11  dynsyms=`mktemp`
12  funcsyms=`mktemp`
13  keep_symbols=`mktemp`
14  mini_debuginfo=`mktemp`
15
16  # Extract the dynamic symbols from the main binary, there is no need to also have these
17  # in the normal symbol table
18  nm -D "$binary" --format=posix --defined-only | awk '{ print $1 }' | sort > "$dynsyms"
19  # Extract all the text (i.e. function) symbols from the debuginfo
20  nm "$debuginfo" --format=posix --defined-only | awk '{ if ($2 == "T" || $2 == "t") print $1 }' | sort > "$funcsyms"
21  # Keep all the function symbols not already in the dynamic symbol table
22  comm -13 "$dynsyms" "$funcsyms" > "$keep_symbols"
23  # Copy the full debuginfo, keeping only a minumal set of symbols and removing some unnecessary sections
24  objcopy -S --remove-section .gdb_index --remove-section .comment --keep-symbols="$keep_symbols" "$debuginfo" "$mini_debuginfo" &> /dev/null
25  #Inject the compressed data into the .gnu_debugdata section of the original binary
26  xz "$mini_debuginfo"
27  mini_debuginfo="${mini_debuginfo}.xz"
28  objcopy --add-section .gnu_debugdata="$mini_debuginfo" "$binary"
29  rm -f "$dynsyms" "$funcsyms" "$keep_symbols" "$mini_debuginfo"
30
31  strip "$binary" ## throw away the symbol table
32}
33
34
35TESTDIR=`pwd`
36TEMPDIR=`mktemp --tmpdir -d libunwind-test-XXXXXXXXXX`
37trap "rm -r -- $TEMPDIR" EXIT
38
39cp crasher $TEMPDIR/crasher
40if [ "$1" = "-minidebuginfo" ]; then
41  add_minidebug $TEMPDIR/crasher
42fi
43
44# create core dump
45(
46    cd $TEMPDIR
47    ulimit -c 10000
48    ./crasher backing_files
49) 2>/dev/null
50COREFILE=$TEMPDIR/core*
51
52# magic option -testcase enables checking for the specific contents of the stack
53./test-coredump-unwind $COREFILE -testcase `cat $TEMPDIR/backing_files`
54