xref: /dpdk/devtools/check-abi-version.sh (revision 2be668709cfc7c906106b93525790a50d478642d)
1b09afc2aSDavid Marchand#!/bin/sh
2b09afc2aSDavid Marchand# SPDX-License-Identifier: BSD-3-Clause
3b09afc2aSDavid Marchand# Copyright(c) 2019 Intel Corporation
4b09afc2aSDavid Marchand
5b09afc2aSDavid Marchand# Check whether library symbols have correct
6b09afc2aSDavid Marchand# version (provided ABI number or provided ABI
7*2be66870SHaiyue Wang# number + 1 or EXPERIMENTAL or INTERNAL).
8b09afc2aSDavid Marchand# Args:
9b09afc2aSDavid Marchand#   $1: path of the library .so file
10b09afc2aSDavid Marchand#   $2: ABI major version number to check
11b09afc2aSDavid Marchand#       (defaults to ABI_VERSION file value)
12b09afc2aSDavid Marchand
13b09afc2aSDavid Marchandif [ -z "$1" ]; then
14b09afc2aSDavid Marchand    echo "Script checks whether library symbols have"
15*2be66870SHaiyue Wang    echo "correct version (ABI_VER/ABI_VER+1/EXPERIMENTAL/INTERNAL)"
16b09afc2aSDavid Marchand    echo "Usage:"
17b09afc2aSDavid Marchand    echo "  $0 SO_FILE_PATH [ABI_VER]"
18b09afc2aSDavid Marchand    exit 1
19b09afc2aSDavid Marchandfi
20b09afc2aSDavid Marchand
21b09afc2aSDavid MarchandLIB="$1"
22b09afc2aSDavid MarchandDEFAULT_ABI=$(cat "$(dirname \
23b09afc2aSDavid Marchand            $(readlink -f $0))/../ABI_VERSION" | \
24b09afc2aSDavid Marchand            cut -d'.' -f 1)
25b09afc2aSDavid MarchandABIVER="DPDK_${2-$DEFAULT_ABI}"
26b09afc2aSDavid MarchandNEXT_ABIVER="DPDK_$((${2-$DEFAULT_ABI}+1))"
27b09afc2aSDavid Marchand
28b09afc2aSDavid Marchandret=0
29b09afc2aSDavid Marchand
30b09afc2aSDavid Marchand# get output of objdump
31b09afc2aSDavid MarchandOBJ_DUMP_OUTPUT=`objdump -TC --section=.text ${LIB} 2>&1 | grep ".text"`
32b09afc2aSDavid Marchand
33b09afc2aSDavid Marchand# there may not be any .text sections in the .so file, in which case exit early
34b09afc2aSDavid Marchandecho "${OBJ_DUMP_OUTPUT}" | grep "not found in any input file" -q
35b09afc2aSDavid Marchandif [ "$?" -eq 0 ]; then
36b09afc2aSDavid Marchand    exit 0
37b09afc2aSDavid Marchandfi
38b09afc2aSDavid Marchand
39b09afc2aSDavid Marchand# we have symbols, so let's see if the versions are correct
40b09afc2aSDavid Marchandfor SYM in $(echo "${OBJ_DUMP_OUTPUT}" | awk '{print $(NF-1) "-" $NF}')
41b09afc2aSDavid Marchanddo
42b09afc2aSDavid Marchand    version=$(echo $SYM | cut -d'-' -f 1)
43b09afc2aSDavid Marchand    symbol=$(echo $SYM | cut -d'-' -f 2)
44*2be66870SHaiyue Wang    case $version in (*"$ABIVER"*|*"$NEXT_ABIVER"*|"EXPERIMENTAL"|"INTERNAL")
45b09afc2aSDavid Marchand        ;;
46b09afc2aSDavid Marchand    (*)
47b09afc2aSDavid Marchand        echo "Warning: symbol $symbol ($version) should be annotated " \
48*2be66870SHaiyue Wang             "as ABI version $ABIVER / $NEXT_ABIVER, EXPERIMENTAL, or INTERNAL."
49b09afc2aSDavid Marchand        ret=1
50b09afc2aSDavid Marchand    ;;
51b09afc2aSDavid Marchand    esac
52b09afc2aSDavid Marchanddone
53b09afc2aSDavid Marchand
54b09afc2aSDavid Marchandexit $ret
55