Android NDK создает tcpdump для другой арки

Привет, я использую этот сценарий, но не могу понять, почему компилятор не может найти библиотеки заголовков.

Это сценарий, который я использую:

#!/bin/sh

SCRIPT_VERSION=1.0
BUILD_DIR=build

DEFAULT_TCPDUMP_VERSION=4.9.2
DEFAULT_LIBPCAP_VERSION=1.8.1

GIT_LIBPCAP = "https://github.com/the-tcpdump-group/libpcap.git"
GIT_TCPDUMP = "https://github.com/the-tcpdump-group/tcpdump.git"

BASE_URL = "http://www.tcpdump.org/release"

ALL_ARCHS = "arm arm64 mips mips64 x86 x86_64"

TOOLCHAINS = "arm:arm-linux-androideabi-4.9:21 
            arm64:aarch64-linux-android-4.9:21 
            mips64:mips64el-linux-android-4.9:21
            x86:x86-4.9:21
            x86_64:x86_64-4.9:21"

ARCH_TRANSLATIONS = "arm:arm-linux
                   arm64:aarch64-linux
                   mips:mipsel-linux
                   mips64:mips64el-linux
                   x86:x86
                   x86_64:x86_64"

BASE_CFLAGS = "-O2 -fPIC -fPIE"
BASE_LDFLAGS = ""

EXTRA_CFLAGS_arm = "-march=armv7-a -mthumb -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS_arm = "-march=armv7-a -Wl,--fix-cortex-a8"

absolute_path() {
    local ABS_PATH=$(cd "$1"; pwd)
    echo $ABS_PATH
}

usage() {
    PROGRAM=`basename $1`
    echo "Usage: $PROGRAM [OPTIONS]"
    echo "Version: ${SCRIPT_VERSION}"
    echo "Automatically download and build tcpdump for Android devices"
    echo "Also valid for Lollipop and Marshmallow"
    echo ""
    echo "OPTIONS:"
    echo "-h              Show this help"
    echo "-a=ARCHS        Space separated architectures to build or all. Default: all"
    echo "                Valid architectures: ${ALL_ARCHS}"
    echo "-n=NDK_PATH     Path of the Android NDK root"
    echo "                Default: Value of the NDK environment variable"
    echo "-b=BUILD_DIR    Destination of the compiled tcpdump. Default: build"
    echo "-s              Don't strip the final executable"
    echo "-j=NPROCS       Number of simultaneous jobs when compiling"
    echo "                Default: Number of cores of the machine"
    echo "-t=TCPDUMP_VER  Version of tcpdump or \"master\" for the latest revision in the repository"
    echo "                Default: ${DEFAULT_TCPDUMP_VERSION}"
    echo "-l=LIBPCAP_VER  Version of libpcap or \"master\" for the latest revision in the repository"
    echo "                Default: ${DEFAULT_LIBPCAP_VERSION}"
    echo "-u=TCPDUMP_DIR  Don't download tcpdump. Use the one in the specified directory"
    echo "-m=LIBPCAP_DIR  Don't download libpcap. Use the one in the specified directory"
    echo
}


check_requirements() {

    if [ ! -f "${NDK}/ndk-build" ]; then
        echo "ERROR: Can't find the NDK directory"
        exit 2
    fi

    flex -V > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "ERROR: flex not found"
        exit 2
    fi

    bison -V > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "ERROR: bison not found"
        exit 2
    fi

    if [ "${VERSION_LIBPCAP}" = "master" -o "${VERSION_TCPDUMP}" = "master" ]; then
        git --version > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "ERROR: git not found"
            exit 2
        fi
    fi

    if [ "${VERSION_LIBPCAP}" != "master" -o "${VERSION_TCPDUMP}" != "master" ]; then
        wget -V > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            DOWNLOADER=wget
        else
            curl -V > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                DOWNLOADER=curl
            else
                echo "ERROR: wget or curl not found"
                exit 2
            fi
        fi
    fi
}

download_file() {
    local URL = "$1"
    if [ "${DOWNLOADER}" = "wget" ]; then
        wget "${URL}"
    elif [ "${DOWNLOADER}" = "curl" ]; then
        curl -O "${URL}"
    fi
    if [ $? -ne 0 ]; then
        echo "ERROR: Can't download ${URL}"
        exit 3
    fi
}

download() {
    local PROGRAM = "$1"
    local VERSION = "$2"
    local GIT_URL = "$3"
    if [ "${VERSION}" = "master" ]; then
        git clone "${GIT_URL}" "${PROGRAM}"
        if [ $? -ne 0 ]; then
            echo "ERROR: Can't download ${PROGRAM} repository from ${GIT_LIBPCAP}"
            exit 3
        fi
        absolute_path "${PROGRAM}"
    else
        # Download and decompress from their web
        DIR = "${PROGRAM}-${VERSION}"
        FILE = "${DIR}.tar.gz"
        download_file "${BASE_URL}/${FILE}"
        tar xzf "${FILE}"
        if [ $? -ne 0 ]; then
            echo "ERROR: Can't extract ${FILE}"
            exit 3
        fi
        absolute_path "${DIR}"
    fi
}

check_archs() {
    local IS_VALID=no
    for arch in $1; do
        IS_VALID=no
        for valid_arch in ${ALL_ARCHS}; do
            if [ "${valid_arch}" = "${arch}" ]; then
                IS_VALID=yes
                break
            fi                        
        done
        if [ "${IS_VALID}" = "no" ]; then
            echo "ERROR: The architecture ${arch} is not valid. Valid architectures are ${ALL_ARCHS}"
            exit 3
        fi
    done    
}

check_compiler_tools() {
    local ARCH = "$1"
    local toolchain_dir = ""
    for toolchain_info in $TOOLCHAINS; do
        t_arch = "${toolchain_info%%:*}"
        if [ "${t_arch}" = "${ARCH}" ]; then
            toolchain_dir = "${toolchain_info%:*}"
            toolchain_dir = "${toolchain_dir#*:}"
            toolchain_platform=android-"${toolchain_info##*:}"
            break
        fi
    done

    if [ -z "${toolchain_dir}" ]; then
        echo "ERROR: Can't find the toolchain directory for ${ARCH}"
        exit 3
    fi

    local SYSROOT = "${NDK}/platforms/${toolchain_platform}/arch-${ARCH}"

    if [ ! -d "${SYSROOT}" ]; then
        echo "ERROR: Can't find the platform directory ${toolchain_platform} for ${ARCH}"
        exit 3
    fi

    CONFIG_ARCH = ""
    for arch_translation in $ARCH_TRANSLATIONS; do
        t_arch = "${arch_translation%%:*}"        
        if [ "${t_arch}" = "${ARCH}" ]; then
            CONFIG_ARCH = "${arch_translation##*:}"
            break
        fi
    done

    if [ -z "${CONFIG_ARCH}" ]; then
        echo "ERROR: Can't determine the architecture for the \"configure\" script"
        exit 3
    fi

    CC = ""
    COMPILERS=$(find "${NDK}/toolchains/${toolchain_dir}/prebuilt" -type f -name "*-gcc")
    for compiler in $COMPILERS; do
        printf "Testing ${compiler}... "
        $compiler --version >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo "OK"
            CC = "$compiler --sysroot=${SYSROOT}"
            break
        fi
        echo "NOT VALID"
    done

    if [ -z "${CC}" ]; then
        echo "ERROR: Can't find a valid compiler"
    fi

    RANLIB_TOOL = ""
    RANLIBS=$(find "${NDK}/toolchains/${toolchain_dir}/prebuilt" -type f -name "*-ranlib")
    for ranlib in $RANLIBS; do
        printf "Testing ${ranlib}... "
        $ranlib --version >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo "OK"
            RANLIB_TOOL = "${ranlib}"
            break
        fi
        echo "NOT VALID"
    done

    if [ -z "${RANLIB_TOOL}" ]; then
        echo "ERROR: Can't find a valid ranlib tool"
    fi


    if [ "${SHOULD_STRIP}" = "yes" ]; then
        STRIP_TOOL = ""
        local STRIP_TOOLS=$(find "${NDK}/toolchains/${toolchain_dir}/prebuilt" -type f -name "*-strip")
        for strip_tool in $STRIP_TOOLS; do
            printf "Testing ${strip_tool}... "
            $strip_tool --version >/dev/null 2>&1
            if [ $? -eq 0 ]; then
                echo "OK"
                STRIP_TOOL = "$strip_tool"
                break
            fi
            echo "NOT VALID"
        done

        if [ -z "${STRIP_TOOL}" ]; then
            echo "ERROR: Can't find a valid strip tool"
        fi        
    fi
}

SHOULD_STRIP=yes
ARCHS = "${ALL_ARCHS}"
TCPDUMP_VERSION = "${DEFAULT_TCPDUMP_VERSION}"
LIBPCAP_VERSION = "${DEFAULT_LIBPCAP_VERSION}"
NPROCS=`getconf _NPROCESSORS_ONLN`

DIR_LIBPCAP = ""
DIR_TCPDUMP = ""

while getopts "ha:n:b:sj:t:l:u:m:" arg; do
    case "${arg}" in
        a)
            if [ "${OPTARG}" = "all" ]; then
                ARCHS = "${ALL_ARCHS}"
            else
                ARCHS = "${OPTARG}"
                check_archs "${ARCHS}"
            fi
            ;;
        t)
            TCPDUMP_VERSION = "${OPTARG}"
            ;;
        l)
            LIBPCAP_VERSION = "${OPTARG}"
            ;;
        n)
            NDK = "${OPTARG}"
            ;;

        s) 
            SHOULD_STRIP=no
            ;;

        b)
            BUILD_DIR = "${OPTARG}"
            ;;        
        j)
            NPROCS = "${OPTARG}"
            ;;
        u)
            DIR_TCPDUMP = "${OPTARG}"
            ;;
        m)
            DIR_LIBPCAP = "${OPTARG}"
            ;;
        h)
            usage $0
            exit 0
            ;;
        *)
            usage $0
            echo "ERROR: Invalid option"
            exit 1
            ;;
    esac
done

if [ ! -d "${BUILD_DIR}" ]; then
    mkdir "${BUILD_DIR}" >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "ERROR: Can't create the directory ${BUILD_DIR}"
        exit 3
    fi
fi

BUILD_DIR=`absolute_path "${BUILD_DIR}"`


echo "Checking basic requirements..."
check_requirements
if [ -z "${DIR_LIBPCAP}" -o -z "${DIR_TCPDUMP}" ]; then
    echo "Downloading source code..."
fi

if [ -z "${DIR_LIBPCAP}" ]; then
    DIR_LIBPCAP=`download libpcap "${LIBPCAP_VERSION}" "${GIT_LIBPCAP}"`
fi

if [ -z "${DIR_TCPDUMP}" ]; then
    DIR_TCPDUMP=`download tcpdump "${TCPDUMP_VERSION}" "${GIT_TCPDUMP}"`
fi

DIR_LIBPCAP=`absolute_path "${DIR_LIBPCAP}"`
DIR_TCPDUMP=`absolute_path "${DIR_TCPDUMP}"`

if [ ! -f "${DIR_LIBPCAP}/configure" ]; then
    echo "ERROR: Can't find the \"configure\" libpcap script in ${DIR_LIBPCAP}"
    exit 3
fi

if [ ! -f "${DIR_TCPDUMP}/configure" ]; then
    echo "ERROR: Can't find the \"configure\" tcpdump script in ${DIR_TCPDUMP}"
    exit 3
fi

GENERATED_FILES = ""

for ARCH in ${ARCHS}; do
    echo
    echo "Checking compiler for ${ARCH}..."
    check_compiler_tools "${ARCH}"
    export CC

    EXTRA_CFLAGS=$(eval echo \$EXTRA_CFLAGS_${ARCH})
    export CFLAGS = "${BASE_CFLAGS} ${EXTRA_CFLAGS}"

    EXTRA_LDFLAGS=$(eval echo \$EXTRA_LDFLAGS_${ARCH})
    export LDFLAGS = "${BASE_LDFLAGS} ${EXTRA_LDFLAGS}"

    echo "Compiling libpcap for ${ARCH}..."
    cd "${DIR_LIBPCAP}"    

    CONFIGURE_COMMAND = "./configure --host=${CONFIG_ARCH} --with-pcap=linux"
    echo "${CONFIGURE_COMMAND}"
    ${CONFIGURE_COMMAND}
    if [ $? -ne 0 ]; then
        echo "ERROR: Failed configuring libpcap"
        echo "CC = ${CC}"
        echo "CFLAGS = ${CFLAGS}"
        echo "LDFLAGS = ${LDFLAGS}"
        exit 4
    fi
    make clean && make -j "${NPROCS}"
    if [ $? -ne 0 ]; then
        echo "ERROR: Failed compiling libpcap"
        exit 4
    fi    

    if [ ! -f libpcap.a ]; then
        echo "ERROR: lipcap.a not generated"
        exit 4
    fi

    ${RANLIB_TOOL} libpcap.a
    if [ $? -ne 0 ]; then
        echo "ERROR: Failed executing ${RANLIB_TOOL} on libpcap.a"
        exit 4
    fi

    echo "Compiling tcpdump for ${ARCH}..."
    cd "${DIR_TCPDUMP}"

    export CFLAGS = "${CFLAGS} -I${DIR_LIBPCAP} -L${DIR_LIBPCAP}"
    export LDFLAGS = "${LDFLAGS} -pie"
    CONFIGURE_COMMAND = "./configure --host=${CONFIG_ARCH}"
    echo "${CONFIGURE_COMMAND}"
    ${CONFIGURE_COMMAND}
    echo "CC = $CC"
    echo "CFLAGS = $CFLAGS"
    echo "LDFLAGS = $LDFLAGS"
    if [ $? -ne 0 ]; then
        echo "ERROR: Failed configuring tcpdump"
        exit 4
    fi
    make clean && make -j "${NPROCS}"
    if [ $? -ne 0 ]; then
        echo "ERROR: Failed compiling tcpdump"
        exit 4
    fi    

    mkdir "${BUILD_DIR}/${TCPDUMP_VERSION}" 2>/dev/null
    mkdir "${BUILD_DIR}/${TCPDUMP_VERSION}/${ARCH}" 2>/dev/null

    if [ -n "${STRIP_TOOL}" ]; then
        echo "Stripping tcpdump..."
        "${STRIP_TOOL}" tcpdump
    fi

    mv tcpdump "${BUILD_DIR}/${TCPDUMP_VERSION}/${ARCH}/tcpdump"
    if [ $? -ne 0 ]; then
        echo "ERROR: Can't move tcpdump to ${BUILD_DIR}/${TCPDUMP_VERSION}/${ARCH}/tcpdump"
        exit 5
    fi

    echo "Created ${BUILD_DIR}/${TCPDUMP_VERSION}/${ARCH}/tcpdump"
    GENERATED_FILES = "${GENERATED_FILES} ${BUILD_DIR}/${TCPDUMP_VERSION}/${ARCH}/tcpdump"
done

if [ -n "${GENERATED_FILES}" ]; then
    echo
    echo "Generated files:"
    for file in ${GENERATED_FILES}; do
        echo $file
    done
fi

Я попытался изменить системный корень на:

local SYSROOT = "${NDK}/sysroot"

Но после этого говорится:

configure: error: C compiler cannot create executables

Ошибка настройки: ОШИБКА: не удалось настроить libpcap.

CC = /home/ndk-r17b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/home/ndk-r17b/platforms/android-21/arch-arm
CFLAGS = -O2 -fPIC -fPIE -march=armv7-a -mthumb -mfloat-abi=softfp -mfpu=neon
LDFLAGS =  -march=armv7-a -Wl,--fix-cortex-a8

Может ли кто-нибудь помочь с настройкой этого скрипта, я пробовал некоторые изменения, но ничего в конце ... Или, может быть, есть какой-нибудь простой способ скомпилировать tcpdump с последней версией NDK, потому что я много искал, и все, что я нашел, было старым скриптом и инструментами Спасибо

0
0
163
1

Ответы 1

Как вы называете компиляторы NDK?

Прежде всего, структура NDK менялась пару раз после того, как они были должным образом интегрированы в Android Studio с последующим удалением устаревших заголовков и gcc.

Для этого типа компиляций вы должны начать с создания автономной версии инструментальной цепочки, используя сценарии, предоставленные NDK, как описано здесь.

https://developer.android.com/ndk/guides/standalone_toolchain

я понимаю это, но я не могу настроить этот скрипт с BASH для создания рабочего двоичного файла

EAK TEAM 18.07.2018 14:23

Другие вопросы по теме