14418919fSjohnjiang#!/bin/sh
24418919fSjohnjiang# SPDX-License-Identifier: BSD-3-Clause
34418919fSjohnjiang# Copyright(c) 2019 Intel Corporation
44418919fSjohnjiang
54418919fSjohnjiang# Check whether library symbols have correct
64418919fSjohnjiang# version (provided ABI number or provided ABI
7*2d9fd380Sjfb8856606# number + 1 or EXPERIMENTAL or INTERNAL).
84418919fSjohnjiang# Args:
94418919fSjohnjiang#   $1: path of the library .so file
104418919fSjohnjiang#   $2: ABI major version number to check
114418919fSjohnjiang#       (defaults to ABI_VERSION file value)
124418919fSjohnjiang
134418919fSjohnjiangif [ -z "$1" ]; then
144418919fSjohnjiang    echo "Script checks whether library symbols have"
15*2d9fd380Sjfb8856606    echo "correct version (ABI_VER/ABI_VER+1/EXPERIMENTAL/INTERNAL)"
164418919fSjohnjiang    echo "Usage:"
174418919fSjohnjiang    echo "  $0 SO_FILE_PATH [ABI_VER]"
184418919fSjohnjiang    exit 1
194418919fSjohnjiangfi
204418919fSjohnjiang
214418919fSjohnjiangLIB="$1"
224418919fSjohnjiangDEFAULT_ABI=$(cat "$(dirname \
234418919fSjohnjiang            $(readlink -f $0))/../ABI_VERSION" | \
244418919fSjohnjiang            cut -d'.' -f 1)
254418919fSjohnjiangABIVER="DPDK_${2-$DEFAULT_ABI}"
264418919fSjohnjiangNEXT_ABIVER="DPDK_$((${2-$DEFAULT_ABI}+1))"
274418919fSjohnjiang
284418919fSjohnjiangret=0
294418919fSjohnjiang
304418919fSjohnjiang# get output of objdump
314418919fSjohnjiangOBJ_DUMP_OUTPUT=`objdump -TC --section=.text ${LIB} 2>&1 | grep ".text"`
324418919fSjohnjiang
334418919fSjohnjiang# there may not be any .text sections in the .so file, in which case exit early
344418919fSjohnjiangecho "${OBJ_DUMP_OUTPUT}" | grep "not found in any input file" -q
354418919fSjohnjiangif [ "$?" -eq 0 ]; then
364418919fSjohnjiang    exit 0
374418919fSjohnjiangfi
384418919fSjohnjiang
394418919fSjohnjiang# we have symbols, so let's see if the versions are correct
404418919fSjohnjiangfor SYM in $(echo "${OBJ_DUMP_OUTPUT}" | awk '{print $(NF-1) "-" $NF}')
414418919fSjohnjiangdo
424418919fSjohnjiang    version=$(echo $SYM | cut -d'-' -f 1)
434418919fSjohnjiang    symbol=$(echo $SYM | cut -d'-' -f 2)
44*2d9fd380Sjfb8856606    case $version in (*"$ABIVER"*|*"$NEXT_ABIVER"*|"EXPERIMENTAL"|"INTERNAL")
454418919fSjohnjiang        ;;
464418919fSjohnjiang    (*)
474418919fSjohnjiang        echo "Warning: symbol $symbol ($version) should be annotated " \
48*2d9fd380Sjfb8856606             "as ABI version $ABIVER / $NEXT_ABIVER, EXPERIMENTAL, or INTERNAL."
494418919fSjohnjiang        ret=1
504418919fSjohnjiang    ;;
514418919fSjohnjiang    esac
524418919fSjohnjiangdone
534418919fSjohnjiang
544418919fSjohnjiangexit $ret
55