blob: 59bf8a3bb1ae324a7dfc331a8aa172168e51e3b4 [file] [log] [blame]
Colin Cross26c34ed2016-09-30 17:10:16 -07001#!/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
12OPTSTRING=d:i:o:-:
13
14usage() {
15 cat <<EOF
16Usage: toc.sh [options] -i in-file -o out-file -d deps-file
17Options:
18EOF
19 exit 1
20}
21
22do_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
27do_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
33while 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
45done
46
47if [ -z "${infile}" ]; then
48 echo "-i argument is required"
49 usage
50fi
51
52if [ -z "${outfile}" ]; then
53 echo "-o argument is required"
54 usage
55fi
56
57if [ -z "${depsfile}" ]; then
58 echo "-d argument is required"
59 usage
60fi
61
62rm -f "${outfile}.tmp"
63
64cat <<EOF > "${depsfile}"
65${outfile}: \\
66 ${CROSS_COMPILE}readelf \\
67EOF
68
69do_elf
70
71if cmp "${outfile}" "${outfile}.tmp" > /dev/null 2> /dev/null; then
72 rm -f "${outfile}.tmp"
73else
74 mv -f "${outfile}.tmp" "${outfile}"
75fi