| Colin Cross | 26c34ed | 2016-09-30 17:10:16 -0700 | [diff] [blame] | 1 | #!/bin/bash -eu | 
 | 2 |  | 
 | 3 | # Script to handle generating a .toc file from a .so file | 
 | 4 | # Inputs: | 
 | 5 | #  Environment: | 
 | 6 | #   CROSS_COMPILE: prefix added to readelf tool | 
 | 7 | #  Arguments: | 
 | 8 | #   -i ${file}: input file (required) | 
 | 9 | #   -o ${file}: output file (required) | 
 | 10 | #   -d ${file}: deps file (required) | 
 | 11 |  | 
 | 12 | OPTSTRING=d:i:o:-: | 
 | 13 |  | 
 | 14 | usage() { | 
 | 15 |     cat <<EOF | 
 | 16 | Usage: toc.sh [options] -i in-file -o out-file -d deps-file | 
 | 17 | Options: | 
 | 18 | EOF | 
 | 19 |     exit 1 | 
 | 20 | } | 
 | 21 |  | 
 | 22 | do_elf() { | 
 | 23 |     ("${CROSS_COMPILE}readelf" -d "${infile}" | grep SONAME || echo "No SONAME for ${infile}") > "${outfile}.tmp" | 
 | 24 |     "${CROSS_COMPILE}readelf" --dyn-syms "${infile}" | awk '{$2=""; $3=""; print}' >> "${outfile}.tmp" | 
 | 25 | } | 
 | 26 |  | 
 | 27 | do_macho() { | 
 | 28 |     otool -l "${infile}" | grep LC_ID_DYLIB -A 5 > "${outfile}.tmp" | 
 | 29 |     nm -gP "${infile}" | cut -f1-2 -d" " | grep -v 'U$' >> "${outfile}.tmp" | 
 | 30 | } | 
 | 31 |  | 
 | 32 |  | 
 | 33 | while getopts $OPTSTRING opt; do | 
 | 34 |     case "$opt" in | 
 | 35 |         d) depsfile="${OPTARG}" ;; | 
 | 36 |         i) infile="${OPTARG}" ;; | 
 | 37 |         o) outfile="${OPTARG}" ;; | 
 | 38 |         -) | 
 | 39 |             case "${OPTARG}" in | 
 | 40 |                 *) echo "Unknown option --${OPTARG}"; usage ;; | 
 | 41 |             esac;; | 
 | 42 |         ?) usage ;; | 
 | 43 |         *) echo "'${opt}' '${OPTARG}'" | 
 | 44 |     esac | 
 | 45 | done | 
 | 46 |  | 
 | 47 | if [ -z "${infile}" ]; then | 
 | 48 |     echo "-i argument is required" | 
 | 49 |     usage | 
 | 50 | fi | 
 | 51 |  | 
 | 52 | if [ -z "${outfile}" ]; then | 
 | 53 |     echo "-o argument is required" | 
 | 54 |     usage | 
 | 55 | fi | 
 | 56 |  | 
 | 57 | if [ -z "${depsfile}" ]; then | 
 | 58 |     echo "-d argument is required" | 
 | 59 |     usage | 
 | 60 | fi | 
 | 61 |  | 
 | 62 | rm -f "${outfile}.tmp" | 
 | 63 |  | 
 | 64 | cat <<EOF > "${depsfile}" | 
 | 65 | ${outfile}: \\ | 
 | 66 |   ${CROSS_COMPILE}readelf \\ | 
 | 67 | EOF | 
 | 68 |  | 
 | 69 | do_elf | 
 | 70 |  | 
 | 71 | if cmp "${outfile}" "${outfile}.tmp" > /dev/null 2> /dev/null; then | 
 | 72 |     rm -f "${outfile}.tmp" | 
 | 73 | else | 
 | 74 |     mv -f "${outfile}.tmp" "${outfile}" | 
 | 75 | fi |