1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#!/bin/sh
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# Script to make an offline archive for debugging with libdwfl-based tools.
4cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#	make-debug-archive ARCHIVE {options}
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#	make-debug-archive --kernel [--force] [RELEASE]
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# Valid options are those listed under 'Input selection options'
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# by running @UNSTRIP@ --help.
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# The archive installed by --kernel be used automatically by -K.
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng# An offline archive can be used via -e in any tool that accepts those options.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengUNSTRIP=${UNSTRIP:-@UNSTRIP@}
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengAR=${AR:-@AR@}
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengSUDO=${SUDO:-/usr/bin/sudo}
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengLS=/bin/ls
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengRM=/bin/rm
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengMV=/bin/mv
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengMKDIR=/bin/mkdir
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengXARGS=/usr/bin/xargs
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengoutdir=${TMPDIR:-/tmp}/debugar$$
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
27cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengusage()
28cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
29cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "Usage: $0 ARCHIVE {options}"
30cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "   or: $0 --kernel [--sudo] [--force] [RELEASE]"
31cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo
32cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "Valid options are listed under 'Input selection options'"
33cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "when running: $UNSTRIP --help"
34cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo
35cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "The --kernel form updates the file used by -K if the"
36cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "kernel installation has changed, or always with --force."
37cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "With --sudo, touches the installed file via $SUDO."
38cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
39cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
40cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfatal_usage()
41cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
42cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  usage >&2
43cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  exit 2
44cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
45cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
46cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengscript_version()
47cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
48cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "`basename $0` (@PACKAGE_NAME@) @PACKAGE_VERSION@"
49cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "Copyright (C) 2007 Red Hat, Inc."
50cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "This is free software; see the source for copying conditions."
51cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "There is NO warranty; not even for MERCHANTABILITY or"
52cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "FITNESS FOR A PARTICULAR PURPOSE."
53cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  echo "Written by Roland McGrath."
54cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
55cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
56cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengsudo=
57cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengkernel=no
58cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengforce_kernel=no
59cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengwhile [ $# -gt 0 ]; do
60cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  case "x$1" in
61cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  x--help) usage; exit 0 ;;
62cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  x--version) script_version; exit 0 ;;
63cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  x--kernel) kernel=yes ;;
64cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  x--force) force_kernel=yes ;;
65cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  x--sudo) sudo=$SUDO ;;
66cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  *) break ;;
67cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  esac
68cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  shift
69cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengdone
70cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
71cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengif [ $kernel = no ] && [ $force_kernel = yes -o -n "$sudo" ]; then
72cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  usage
73cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfi
74cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
75cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengif [ $kernel = yes ]; then
76cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  if [ $# -eq 0 ]; then
77cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    release=`uname -r`
78cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  elif [ $# -eq 1 ]; then
79cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    release=$1
80cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  else
81cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    fatal_usage
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  fi
83cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
84cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  dir=/usr/lib/debug/lib/modules/$release
85cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  archive=$dir/debug.a
86cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  dep=/lib/modules/$release/modules.dep
87cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  if [ ! -d $dir ]; then
89cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    echo >&2 "$0: $dir not installed"
90cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    exit 1
91cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  fi
92cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
93cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  # Without --force, bail if the kernel installation is not newer.
94cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  # This file is normally touched by installing new kernels or modules.
95cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  if [ $force_kernel = no -a "$archive" -nt "$dep" ]; then
96cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    exit 0
97cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  fi
98cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
99cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  # We have to kill the old one first, because our own -K would use it.
100cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  [ ! -e "$archive" ] || $sudo $RM -f "$archive" || exit
101cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
102cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  set "$archive" "-K$release"
103cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfi
104cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
105cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengif [ $# -lt 2 ]; then
106cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  fatal_usage
107cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfi
108cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
109cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengarchive="$1"
110cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengshift
111cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
112cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengcase "$archive" in
113cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/*) ;;
114cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng*) archive="`/bin/pwd`/$archive" ;;
115cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengesac
116cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
117cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengif [ -z "$sudo" ]; then
118cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  new_archive="$archive.new"
119cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengelse
120cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  new_archive="$outdir.a"
121cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfi
122cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
123cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng$RM -f "$new_archive" || exit
124cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
125cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengtrap '$RM -rf "$outdir" "$new_archive"' 0 1 2 15
126cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
127cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng$MKDIR "$outdir" &&
128cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng$UNSTRIP -d "$outdir" -m -a -R "$@" &&
129cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng(cd "$outdir" && $LS | $XARGS $AR cq "$new_archive") &&
130cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng$sudo $MV -f "$new_archive" "$archive"
131cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
132cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengexit
133