1*333d2b36SAndroid Build Coastguard Worker#!/bin/bash -eu 2*333d2b36SAndroid Build Coastguard Worker 3*333d2b36SAndroid Build Coastguard Worker# Copyright 2017 Google Inc. All rights reserved. 4*333d2b36SAndroid Build Coastguard Worker# 5*333d2b36SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*333d2b36SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*333d2b36SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*333d2b36SAndroid Build Coastguard Worker# 9*333d2b36SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*333d2b36SAndroid Build Coastguard Worker# 11*333d2b36SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*333d2b36SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*333d2b36SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*333d2b36SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*333d2b36SAndroid Build Coastguard Worker# limitations under the License. 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker# Script to handle generating a .toc file from a .so file 18*333d2b36SAndroid Build Coastguard Worker# Inputs: 19*333d2b36SAndroid Build Coastguard Worker# Environment: 20*333d2b36SAndroid Build Coastguard Worker# CLANG_BIN: path to the clang bin directory 21*333d2b36SAndroid Build Coastguard Worker# Arguments: 22*333d2b36SAndroid Build Coastguard Worker# -i ${file}: input file (required) 23*333d2b36SAndroid Build Coastguard Worker# -o ${file}: output file (required) 24*333d2b36SAndroid Build Coastguard Worker# -d ${file}: deps file (required) 25*333d2b36SAndroid Build Coastguard Worker# --elf | --macho | --pe: format (required) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard WorkerOPTSTRING=d:i:o:-: 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerusage() { 30*333d2b36SAndroid Build Coastguard Worker cat <<EOF 31*333d2b36SAndroid Build Coastguard WorkerUsage: toc.sh [options] -i in-file -o out-file -d deps-file 32*333d2b36SAndroid Build Coastguard WorkerOptions: 33*333d2b36SAndroid Build Coastguard WorkerEOF 34*333d2b36SAndroid Build Coastguard Worker exit 1 35*333d2b36SAndroid Build Coastguard Worker} 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Workerdo_elf() { 38*333d2b36SAndroid Build Coastguard Worker ("${CLANG_BIN}/llvm-readelf" -d "${infile}" | grep SONAME || echo "No SONAME for ${infile}") > "${outfile}.tmp" 39*333d2b36SAndroid Build Coastguard Worker "${CLANG_BIN}/llvm-readelf" --dyn-syms "${infile}" | awk '{$2=""; $3=""; print}' >> "${outfile}.tmp" 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Worker cat <<EOF > "${depsfile}" 42*333d2b36SAndroid Build Coastguard Worker${outfile}: \\ 43*333d2b36SAndroid Build Coastguard Worker ${CLANG_BIN}/llvm-readelf \\ 44*333d2b36SAndroid Build Coastguard WorkerEOF 45*333d2b36SAndroid Build Coastguard Worker} 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Workerdo_macho() { 48*333d2b36SAndroid Build Coastguard Worker "${CLANG_BIN}/llvm-objdump" -p "${infile}" | grep LC_ID_DYLIB -A 5 > "${outfile}.tmp" 49*333d2b36SAndroid Build Coastguard Worker "${CLANG_BIN}/llvm-nm" -gP "${infile}" | cut -f1-2 -d" " | (grep -v 'U$' >> "${outfile}.tmp" || true) 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Worker cat <<EOF > "${depsfile}" 52*333d2b36SAndroid Build Coastguard Worker${outfile}: \\ 53*333d2b36SAndroid Build Coastguard Worker ${CLANG_BIN}/llvm-objdump \\ 54*333d2b36SAndroid Build Coastguard Worker ${CLANG_BIN}/llvm-nm \\ 55*333d2b36SAndroid Build Coastguard WorkerEOF 56*333d2b36SAndroid Build Coastguard Worker} 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Workerdo_pe() { 59*333d2b36SAndroid Build Coastguard Worker "${CLANG_BIN}/llvm-objdump" -x "${infile}" | grep "^Name" | cut -f3 -d" " > "${outfile}.tmp" 60*333d2b36SAndroid Build Coastguard Worker "${CLANG_BIN}/llvm-nm" -gP "${infile}" | cut -f1-2 -d" " >> "${outfile}.tmp" 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker cat <<EOF > "${depsfile}" 63*333d2b36SAndroid Build Coastguard Worker${outfile}: \\ 64*333d2b36SAndroid Build Coastguard Worker ${CLANG_BIN}/llvm-objdump \\ 65*333d2b36SAndroid Build Coastguard Worker ${CLANG_BIN}/llvm-nm \\ 66*333d2b36SAndroid Build Coastguard WorkerEOF 67*333d2b36SAndroid Build Coastguard Worker} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workerwhile getopts $OPTSTRING opt; do 70*333d2b36SAndroid Build Coastguard Worker case "$opt" in 71*333d2b36SAndroid Build Coastguard Worker d) depsfile="${OPTARG}" ;; 72*333d2b36SAndroid Build Coastguard Worker i) infile="${OPTARG}" ;; 73*333d2b36SAndroid Build Coastguard Worker o) outfile="${OPTARG}" ;; 74*333d2b36SAndroid Build Coastguard Worker -) 75*333d2b36SAndroid Build Coastguard Worker case "${OPTARG}" in 76*333d2b36SAndroid Build Coastguard Worker elf) elf=1 ;; 77*333d2b36SAndroid Build Coastguard Worker macho) macho=1 ;; 78*333d2b36SAndroid Build Coastguard Worker pe) pe=1 ;; 79*333d2b36SAndroid Build Coastguard Worker *) echo "Unknown option --${OPTARG}"; usage ;; 80*333d2b36SAndroid Build Coastguard Worker esac;; 81*333d2b36SAndroid Build Coastguard Worker ?) usage ;; 82*333d2b36SAndroid Build Coastguard Worker *) echo "'${opt}' '${OPTARG}'" 83*333d2b36SAndroid Build Coastguard Worker esac 84*333d2b36SAndroid Build Coastguard Workerdone 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerif [ -z "${infile:-}" ]; then 87*333d2b36SAndroid Build Coastguard Worker echo "-i argument is required" 88*333d2b36SAndroid Build Coastguard Worker usage 89*333d2b36SAndroid Build Coastguard Workerfi 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Workerif [ -z "${outfile:-}" ]; then 92*333d2b36SAndroid Build Coastguard Worker echo "-o argument is required" 93*333d2b36SAndroid Build Coastguard Worker usage 94*333d2b36SAndroid Build Coastguard Workerfi 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Workerif [ -z "${depsfile:-}" ]; then 97*333d2b36SAndroid Build Coastguard Worker echo "-d argument is required" 98*333d2b36SAndroid Build Coastguard Worker usage 99*333d2b36SAndroid Build Coastguard Workerfi 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workerif [ -z "${CLANG_BIN:-}" ]; then 102*333d2b36SAndroid Build Coastguard Worker echo "CLANG_BIN environment variable must be set" 103*333d2b36SAndroid Build Coastguard Worker usage 104*333d2b36SAndroid Build Coastguard Workerfi 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Workerrm -f "${outfile}.tmp" 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Workercat <<EOF > "${depsfile}" 109*333d2b36SAndroid Build Coastguard Worker${outfile}: \\ 110*333d2b36SAndroid Build Coastguard Worker ${CLANG_BIN}/llvm-readelf \\ 111*333d2b36SAndroid Build Coastguard WorkerEOF 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Workerif [ -n "${elf:-}" ]; then 114*333d2b36SAndroid Build Coastguard Worker do_elf 115*333d2b36SAndroid Build Coastguard Workerelif [ -n "${macho:-}" ]; then 116*333d2b36SAndroid Build Coastguard Worker do_macho 117*333d2b36SAndroid Build Coastguard Workerelif [ -n "${pe:-}" ]; then 118*333d2b36SAndroid Build Coastguard Worker do_pe 119*333d2b36SAndroid Build Coastguard Workerelse 120*333d2b36SAndroid Build Coastguard Worker echo "--elf, --macho or --pe is required"; usage 121*333d2b36SAndroid Build Coastguard Workerfi 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Workerif cmp "${outfile}" "${outfile}.tmp" > /dev/null 2> /dev/null; then 124*333d2b36SAndroid Build Coastguard Worker rm -f "${outfile}.tmp" 125*333d2b36SAndroid Build Coastguard Workerelse 126*333d2b36SAndroid Build Coastguard Worker mv -f "${outfile}.tmp" "${outfile}" 127*333d2b36SAndroid Build Coastguard Workerfi 128