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 76