1*62c56f98SSadaf Ebrahimi#!/bin/sh 2*62c56f98SSadaf Ebrahimi# 3*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 4*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 5*62c56f98SSadaf Ebrahimi# 6*62c56f98SSadaf Ebrahimi# Purpose 7*62c56f98SSadaf Ebrahimi# 8*62c56f98SSadaf Ebrahimi# Show external links in built libraries (X509 or TLS) or modules. This is 9*62c56f98SSadaf Ebrahimi# usually done to list Crypto dependencies or to check modules' 10*62c56f98SSadaf Ebrahimi# interdependencies. 11*62c56f98SSadaf Ebrahimi# 12*62c56f98SSadaf Ebrahimi# Usage: 13*62c56f98SSadaf Ebrahimi# - build the library with debug symbols and the config you're interested in 14*62c56f98SSadaf Ebrahimi# (default, full minus MBEDTLS_USE_PSA_CRYPTO, full, etc.) 15*62c56f98SSadaf Ebrahimi# - launch this script with 1 or more arguments depending on the analysis' goal: 16*62c56f98SSadaf Ebrahimi# - if only 1 argument is used (which is the name of the used config, 17*62c56f98SSadaf Ebrahimi# ex: full), then the analysis is done on libmbedx509 and libmbedtls 18*62c56f98SSadaf Ebrahimi# libraries by default 19*62c56f98SSadaf Ebrahimi# - if multiple arguments are provided, then modules' names (ex: pk, 20*62c56f98SSadaf Ebrahimi# pkparse, pkwrite, etc) are expected after the 1st one and the analysis 21*62c56f98SSadaf Ebrahimi# will be done on those modules instead of the libraries. 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf Ebrahimiset -eu 24*62c56f98SSadaf Ebrahimi 25*62c56f98SSadaf Ebrahimi# list mbedtls_ symbols of a given type in a static library 26*62c56f98SSadaf Ebrahimisyms() { 27*62c56f98SSadaf Ebrahimi TYPE="$1" 28*62c56f98SSadaf Ebrahimi FILE="$2" 29*62c56f98SSadaf Ebrahimi 30*62c56f98SSadaf Ebrahimi nm "$FILE" | sed -n "s/[0-9a-f ]*${TYPE} \(mbedtls_.*\)/\1/p" | sort -u 31*62c56f98SSadaf Ebrahimi} 32*62c56f98SSadaf Ebrahimi 33*62c56f98SSadaf Ebrahimi# Check if the provided name refers to a module or library and return the 34*62c56f98SSadaf Ebrahimi# same path with proper extension 35*62c56f98SSadaf Ebrahimiget_file_with_extension() { 36*62c56f98SSadaf Ebrahimi BASE=$1 37*62c56f98SSadaf Ebrahimi if [ -f $BASE.o ]; then 38*62c56f98SSadaf Ebrahimi echo $BASE.o 39*62c56f98SSadaf Ebrahimi elif [ -f $BASE.a ]; then 40*62c56f98SSadaf Ebrahimi echo $BASE.a 41*62c56f98SSadaf Ebrahimi fi 42*62c56f98SSadaf Ebrahimi} 43*62c56f98SSadaf Ebrahimi 44*62c56f98SSadaf Ebrahimi# create listings for the given library 45*62c56f98SSadaf Ebrahimilist() { 46*62c56f98SSadaf Ebrahimi NAME="$1" 47*62c56f98SSadaf Ebrahimi FILE=$(get_file_with_extension "library/${NAME}") 48*62c56f98SSadaf Ebrahimi PREF="${CONFIG}-$NAME" 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimi syms '[TRrD]' $FILE > ${PREF}-defined 51*62c56f98SSadaf Ebrahimi syms U $FILE > ${PREF}-unresolved 52*62c56f98SSadaf Ebrahimi 53*62c56f98SSadaf Ebrahimi diff ${PREF}-defined ${PREF}-unresolved \ 54*62c56f98SSadaf Ebrahimi | sed -n 's/^> //p' > ${PREF}-external 55*62c56f98SSadaf Ebrahimi sed 's/mbedtls_\([^_]*\).*/\1/' ${PREF}-external \ 56*62c56f98SSadaf Ebrahimi | uniq -c | sort -rn > ${PREF}-modules 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimi rm ${PREF}-defined ${PREF}-unresolved 59*62c56f98SSadaf Ebrahimi} 60*62c56f98SSadaf Ebrahimi 61*62c56f98SSadaf EbrahimiCONFIG="${1:-unknown}" 62*62c56f98SSadaf Ebrahimi 63*62c56f98SSadaf Ebrahimi# List of modules to check is provided as parameters 64*62c56f98SSadaf Ebrahimiif [ $# -gt 1 ]; then 65*62c56f98SSadaf Ebrahimi shift 1 66*62c56f98SSadaf Ebrahimi ITEMS_TO_CHECK="$@" 67*62c56f98SSadaf Ebrahimielse 68*62c56f98SSadaf Ebrahimi ITEMS_TO_CHECK="libmbedx509 libmbedtls" 69*62c56f98SSadaf Ebrahimifi 70*62c56f98SSadaf Ebrahimi 71*62c56f98SSadaf Ebrahimifor ITEM in $ITEMS_TO_CHECK; do 72*62c56f98SSadaf Ebrahimi list $ITEM 73*62c56f98SSadaf Ebrahimidone 74