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