xref: /aosp_15_r20/build/soong/scripts/toc.sh (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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