2013-05-08 11 views
8

안녕하세요 저는 Android 용 Android 용 valgrind를 제작하려고합니다. Linux Mint 13에서는 다음과 함께 실패합니다.Android valgrind 빌드가 실패합니다.

$ make 
echo "# This is a generated file, composed of the following suppression rules:" > default.supp 
echo "# " exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp >> default.supp 
cat exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp >> default.supp 
make all-recursive 
make[1]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1' 
Making all in include 
make[2]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/include' 
make[2]: Nothing to be done for `all'. 
make[2]: Leaving directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/include' 
Making all in VEX 
make[2]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/VEX' 
make all-am 
make[3]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/VEX' 
gcc -DHAVE_CONFIG_H -I. -I.. -I.. -I../include -I../VEX/pub -DVGA_arm=1 -DVGO_linux=1 -DVGP_arm_linux=1 -DVGPV_arm_linux_vanilla=1 -Ipriv -m32 -O2 -g -Wall -Wmissing-prototypes -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -Wno-format-zero-length -fno-strict-aliasing -fno-builtin -marm -mcpu=cortex-a8 -Wbad-function-cast -Wcast-qual -Wcast-align -fstrict-aliasing -Wno-long-long -Wno-pointer-sign -fno-stack-protector -MT libvex_arm_linux_a-main_globals.o -MD -MP -MF .deps/libvex_arm_linux_a-main_globals.Tpo -c -o libvex_arm_linux_a-main_globals.o `test -f 'priv/main_globals.c' || echo './'`priv/main_globals.c 
gcc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ instead 
cc1: error: unrecognised command line option ‘-marm’ 
priv/main_globals.c:1:0: error: bad value (cortex-a8) for -mtune= switch 
make[3]: *** [libvex_arm_linux_a-main_globals.o] Error 1 
make[3]: Leaving directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/VEX' 
make[2]: *** [all] Error 2 
make[2]: Leaving directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/VEX' 
make[1]: *** [all-recursive] Error 1 
make[1]: Leaving directory `/home/matt/Desktop/valgrind/valgrind-3.8.1' 
make: *** [all] Error 2 

저는 ndk-r8e 및 valgrind 3.8.1을 사용하고 있습니다. 구성은 다음으로 끝납니다.

 Maximum build arch: arm 
    Primary build arch: arm 
    Secondary build arch: 
       Build OS: linux 
    Primary build target: ARM_LINUX 
Secondary build target: 
     Platform variant: vanilla 
    Primary -DVGPV string: -DVGPV_arm_linux_vanilla=1 
    Default supp files: exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp 

이 문제를 해결하려면 어떻게해야합니까? 또는 내가 사용할 수있는 사전 제작 된 android-arm valgrind 바이너리가 있습니까?

+0

이유에 대한 OSX에 Valgrind의-3.11.0 컴파일 맥 커널 버전을 사용하고 있습니다. 그러나 한 줄을 변경하여 configure 스크립트를 가짜로 만들면 나중에 많은 오류가 발생합니다. 내 추천은 리눅스 머신 (또는 VM)에서 컴파일하고 바이너리를 그냥 옮기는 것이다. – FDinoff

+0

흠. 이것은 아주 좋은 아이디어입니다. 나는 왜 내가 리눅스에서 그것을 시도하지 않았는지 궁금해. 나는 잠시 후에 그렇게 할 것이다. –

+0

흠. 위의 명령과 동일한 명령을 사용하여 리눅스에서'Platform variant : vanilla'와'Primary -DVGPV string : -DVGPV_arm_linux_vanilla = 1'이 나오고 있습니다. –

답변

1

문제는 구성 스크립트는 환경 변수를 무시했다이었다.

sudo ./configure --prefix=/data/local/Inst --host=armv7-unknown-linux --target=armv7-unknown-linux --with-tmpdir=/sdcard0 CPPFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm -DANDROID_HARDWARE_$HWKIND" CFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm" CC=$CC LD=$LD AR=$AR 

이 변수가 제대로 설정하고 그러나 OSX 마운틴 라이온에서 작동하지 않습니다 리눅스 민트 (13)와 함께 작동하는 보장 : 내가 대신 이런 짓을 만들기 파일을 구성합니다. 나는 가상 머신에서 리눅스를 사용하려고 리눅스 설치에 접근하지 않고 OSX를 사용하는 사람에게 조언 할 것이다. 내가 설정 한 후

2

이것은 리눅스에서 나를 위해 컴파일하기 위해 valgrind를 얻습니다. (android-ndk-r8e 및 valgrind-3.8.1 사용)

웹 사이트에서 타르 볼을 다운로드 한 후 autogen.sh를 실행할 필요가 없습니다.

TOOLCHAIN= 라인이 유효한 툴체인을 가리키는지도 확인하십시오.

export NDK_HOME=$HOME/Downloads/android-ndk-r8e 

export HWKIND=generic 

export TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi 

export AR=$TOOLCHAIN-ar 
export LD=$TOOLCHAIN-ld 
export CC=$TOOLCHAIN-gcc 

CPPFLAGS="--sysroot=$NDK_HOME/platforms/android-14/arch-arm -DANDROID_HARDWARE_$HWKIND" \ 
    CFLAGS="--sysroot=$NDK_HOME/platforms/android-14/arch-arm" \ 
    ./configure --prefix=/data/local/Inst \ 
    --host=armv7-unknown-linux --target=armv7-unknown-linux \ 
    --with-tmpdir=/sdcard 

make 

그것은 결국 사람이 어딘가에 #include <stdint.h>를 추가하는 것을 잊었다처럼 보일

$NDK_HOME/platforms/android-14/arch-arm/usr/include/elf.h:58:3: error: unknown type name 'uint32_t' 

말하는 컴파일 오류를 내놓았다. 이 문제를 해결하기 위해 $NDK_HOME/platforms/android-14/arch-arm/usr/include/elf.h을 편집하고 #include <stdint.h>을이 헤더의 포함 섹션에 추가했습니다. 참고 : 이것은 아마도 최선의 해결책은 아니지만 컴파일 오류를 수정 한 것입니다.


는 맥에 나는 configure 스크립트가 커널 버전을 확인하는 방법을 변경하여 unknown type uint32_t 부분까지 컴파일 얻을 수있었습니다.

구성 스크립트 내에서 kernel=`uname -r`의 스크립트를 검색하여 kernel=3.9.2으로 변경하십시오. (kernel=`uname -r` 두 줄이 첫 번째 줄 또는 두 줄을 바꿉니다.)

이렇게하면 valgrind를 빌드하는 방법을 결정할 때 호스트 커널을 보지 못하게됩니다. (uname -r 그레이브 호스트 커널)

나는 #include <stdint.h>elf.h에 추가하는 것이 Mac에서 작동해야하지만 테스트하지는 않았다.

+0

답변 주셔서 감사합니다. 당신의 지시에 따라 make를 실행할 때'cc1 : error : 인식 할 수없는 명령 행 옵션 '-marm''을 Linux Mint에서 얻습니다. 어떤 배포판을 사용하고 있습니까? –

+0

바이너리를 업로드 할 수 있다면 좋을 것입니다. 나는 왜 온라인에서 하나의 이진 파일을 찾을 수 없는지 전혀 모른다. –

+0

리눅스 민트 13입니다. –

-1

내가 r8e로 빌드를 시도 할 때이 오류가 발생했습니다. 그러나 rXb-ndk (r7b 또는 r8b)을 사용하는 경우이 오류 메시지는 발생하지 않습니다. 구축하고 안드로이드에 대한 Valgrind의 설치를위한

+0

나는 r8b로 다시 시도했지만 빌드는 정확히 같은 방식으로 실패했다. –

+0

이것을 사용하십시오 -> [3.2. Valgrind 도움말에서 Valgrind gdbserver와 GDB를 사용하여 프로그램 디버깅하기]. 아마도 이것이 도움이 될 것입니다. – lllbendelll

+0

도 참조하십시오. http://stackoverflow.com/questions/16450650/android-valgrind-build-fails/19255251#19255251 – lllbendelll

17

내가 build_valgrind.sh에게 전화를 선호하는 아래의 bash는 스크립트를 사용

= 두 개의 추가 스크립트가 필요 사실 (bootstrap_valgrind.sh, RUN_HELLO_JNI_THROUGH_VALGRIND으로 실행하려면 start_valgrind.sh) 아래 디렉토리에서 스크립트를 실행하십시오.

RUN_HELLO_JNI_THROUGH_VALGRIND = true 플래그로 스크립트를 실행하면 Android NDK HOME 내부의 samples 디렉토리에서 hello-jni 응용 프로그램을 빌드하고 전화에 배포 한 후 callgrind 또는 memcheck 도구를 사용하여 Valgrind를 통해 실행합니다. start_valgrind.sh 스크립트에서 지정할 수 있습니다.

다른 두 스크립트

는 여기에 설명되어 있습니다 https://stackoverflow.com/a/19235439/313113

여기 내 디렉토리 구조입니다 :

|-- build_valgrind.sh (the script below) 
|-- bootstrap_valgrind.sh (second script from https://stackoverflow.com/a/19235439/313113) 
|-- start_valgrind.sh (first script from https://stackoverflow.com/a/19235439/313113) 
|-- valgrind-3.10.0 (will be extracted by build_valgrind.sh) 
`-- valgrind-3.10.0.tar.bz2 (will be downloaded by build_valgrind.sh) 

내가 테스트 한 그 사이 애 노젠 모드와 삼성 갤럭시 넥서스 장치의 작동 (memcheck 및 callgrind 도구) 10.2.1 및 Android 4.3.1 및 CyanogenMod 11 20140804 스냅 샷, Android 4.4.4

adb shell ls -lR "/sdcard/*grind*"

으로 생성 된 출력의 파일 크기를 확인할 수 있습니다.

build_valgrind.sh 스크립트 : 내가 가진

#!/usr/bin/env bash 

#set -x 

function extract() 
{ 
    if [ -f "$1" ] ; then 
     case "$1" in 
      *.tar.bz2) tar xvjf "$1"  ;; 
      *.tar.gz) tar xvzf "$1"  ;; 
      *.bz2)  bunzip2 "$1"  ;; 
      *.rar)  unrar x "$1"  ;; 
      *.gz)  gunzip "$1"  ;; 
      *.tar)  tar xvf "$1"  ;; 
      *.tbz2)  tar xvjf "$1"  ;; 
      *.tgz)  tar xvzf "$1"  ;; 
      *.zip)  unzip "$1"  ;; 
      *.Z)   uncompress "$1" ;; 
      *.7z)  7z x "$1"   ;; 
      *)   echo "$1 cannot be extracted via >extract<" ;; 
     esac 
    else 
     echo "'$1' is not a valid file" 
    fi 
} 

RUN_HELLO_JNI_THROUGH_VALGRIND=true 
VALGRIND_VERSION="3.10.0" 
VALGRIND_EXTENSION=".tar.bz2" 
VALGRIND_DIRECTORY="valgrind-${VALGRIND_VERSION}" 
VALGRIND_TARBALL="valgrind-${VALGRIND_VERSION}${VALGRIND_EXTENSION}" 

# Only download Valgrind tarball again if not already downloaded 
if [[ ! -f "${VALGRIND_TARBALL}" ]]; then 
    wget -v -nc "http://valgrind.org/downloads/${VALGRIND_TARBALL}" 
fi 

# Only extract Valgrind tarball again if not already extracted 
if [[ ! -d "$VALGRIND_DIRECTORY" ]]; then 
    extract "$VALGRIND_TARBALL" 
fi 

# Ensure ANDROID_NDK_HOME is set 
if [[ ! -z "$ANDROID_NDK_HOME" ]]; then 
    export ANDROID_NDK_HOME="$HOME/Software/Android/android-ndk-r10c" 
fi 

# Ensure ANDOID_SDK_HOME is set 
if [[ ! -z "$ANDROID_SDK_HOME" ]]; then 
    export ANDROID_SDK_HOME="$HOME/Software/Android/android-sdk/" 
fi 

if [[ ! -d "$VALGRIND_DIRECTORY" ]]; 
then 
    echo "Problem with extracting Valgrind from $VALGRIND_TARBALL into $VALGRIND_DIRECTORY!!!" 
    exit -1 
fi 

# Move to extracted directory 
cd "$VALGRIND_DIRECTORY" 

# ARM Toolchain 
ARCH_ABI="arm-linux-androideabi-4.9" 
export AR="$ANDROID_NDK_HOME/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar" 
export LD="$ANDROID_NDK_HOME/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld" 
export CC="$ANDROID_NDK_HOME/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc" 
export CXX="$ANDROID_NDK_HOME/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++" 

[[ ! -d "$ANDROID_NDK_HOME" || ! -f "$AR" || ! -f "$LD" || ! -f "$CC" || ! -f "$CXX" ]] && echo "Make sure AR, LD, CC, CXX variables are defined correctly. Ensure ANDROID_NDK_HOME is defined also" && exit -1 

# Configure build 
export HWKIND="nexus_s" 
ANDROID_PLATFORM=android-18 
export CPPFLAGS="--sysroot=$ANDROID_NDK_HOME/platforms/${ANDROID_PLATFORM}/arch-arm -DANDROID_HARDWARE_$HWKIND" 
export CFLAGS="--sysroot=$ANDROID_NDK_HOME/platforms/${ANDROID_PLATFORM}/arch-arm" 

# BUG: For some reason file command is unable to detect if the file does not exist with ! -f , it says it doesn't exist even when it does!!! 
BUILD=false 
if [[ "${VALGRIND_DIRECTORY}/Inst/data/local/Inst/bin/valgrind" = *"No such file or directory"* ]]; then 
    BUILD=true 
fi 

if [[ "$BUILD" = true ]]; 
then 
    ./configure --prefix="/data/local/Inst" \ 
    --host="armv7-unknown-linux" \ 
    --target="armv7-unknown-linux" \ 
    --with-tmpdir="/sdcard " 

    [[ $? -ne 0 ]] && echo "Can't configure!" && exit -1 

    # Determine the number of jobs (commands) to be run simultaneously by GNU Make 
    NO_CPU_CORES=$(grep -c ^processor /proc/cpuinfo) 

    if [ $NO_CPU_CORES -le 8 ]; then 
    JOBS=$(($NO_CPU_CORES+1)) 
    else 
    JOBS=${NO_CPU_CORES} 
    fi 

    # Compile Valgrind 
    make -j "${JOBS}" 

    [[ $? -ne 0 ]] && echo "Can't compile!" && exit -1 

    # Install Valgrind locally 
    make -j "${JOBS}" install DESTDIR="$(pwd)/Inst" 
    [[ $? -ne 0 ]] && echo "Can't install!" && exit -1 
fi 

# Push local Valgrind installtion to the phone 
if [[ $(adb shell ls -ld /data/local/Inst/bin/valgrind) = *"No such file or directory"* ]]; 
then 
    adb root 
    adb remount 
    adb shell "[ ! -d /data/local/Inst ] && mkdir /data/local/Inst" 
    adb push Inst/
    adb shell "ls -l /data/local/Inst" 

    # Ensure Valgrind on the phone is running 
    adb shell "/data/local/Inst/bin/valgrind --version" 

    # Add Valgrind executable to PATH (this might fail) 
    adb shell "export PATH=$PATH:/data/local/Inst/bin/" 
fi 

if [ $RUN_HELLO_JNI_THROUGH_VALGRIND = true ]; then 
    PACKAGE="com.example.hellojni" 

    # The location of the Hello JNI sample application 
    HELLO_JNI_PATH="$ANDROID_NDK_HOME/samples/hello-jni" 

    pushd "$HELLO_JNI_PATH" 

    # Update build target to the desired Android SDK version 
    ANDROID_PROJECT_TARGET="android-18" 
    android update project --target "$ANDROID_PROJECT_TARGET" --path . --name hello-jni --subprojects 

    # Enable Android NDK build with Ant 
    echo '<?xml version="1.0" encoding="utf-8"?> 

    <project name="HelloJni" basedir="." default="debug"> 

    <target name="-pre-build"> 
     <exec executable="${ndk.dir}/ndk-build" failonerror="true"/> 
    </target> 

    <target name="clean" depends="android_rules.clean"> 
     <exec executable="${ndk.dir}/ndk-build" failonerror="true"> 
     <arg value="clean"/> 
     </exec> 
    </target> 

    </project> 
    ' > "custom_rules.xml" 

    # Set NDK HOME for Ant (only if not already set) 
    if ! grep -P -q "ndk.dir=.+" "local.properties" ; then 
    echo -e "\nndk.dir=$ANDROID_NDK_HOME" >> "local.properties" 
    fi 

    # Fix for Java 8 warning (warning: [options] source value 1.5 is obsolete and will be removed in a future release) 
    echo "java.compilerargs=-Xlint:-options" >> "ant.properties" 

    # Workaround INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES error 
    adb uninstall "$PACKAGE" 

    # Build Hello JNI project in debug mode and install it on the device 
    ant clean && ant debug && ant installd 

    popd 

    cd .. 

    # Start HelloJNI app 
    adb shell am start -a android.intent.action.MAIN -n $PACKAGE/.HelloJni 

    # Make the script executable 
    chmod a+x bootstrap_valgrind.sh 

    # Run application through Valgrind on the phone 
    /usr/bin/env bash bootstrap_valgrind.sh 

    adb shell ls -lR "/sdcard/*grind*" 
    adb shell ls -lR "/storage/sdcard0/*grind*" 
    adb shell ls -lR "/storage/sdcard1/*grind*" 
fi 

exit 0 
+0

고마워요. 이 스크립트는 실제로 내 특정 문제에 대한 대답이 아니지만 일부에게는 유용 할 수 있습니다. 내가 알아 낸대로 내 문제가 무엇인지에 대한 답변을 올릴 것입니다. –

+0

OSX 10.9.x 에서 이와 같이 Valgrind를 컴파일 할 수 없다는 사실을 누구나 알고 있어야합니다. 또한 ./configure 단계에서 커널 검사를 비활성화해야 할 수도 있습니다. –

+0

@JeffSchmitz 왜? 이것이 OS X에서 작동하지 않는 몇 가지 이유는 무엇입니까? GNU/Linux 데스크톱에서 스크립트를 테스트했습니다. – bitek

2

안드로이드 튜토리얼에서 하나의 옵션은 대한 ranlib를 놓친 - 드디어 설정 스크립트는 그 것을 잘못 커널 버전을 가져옵니다 안드로이드

#/bin/sh 

echo "NKDROOT: " $NDKROOT 

export ANRDOID_TOOLCHAIN="arm-linux-androideabi-4.9" 

# Set up toolchain paths. 
# 
# For ARM 
export AR=$NDKROOT/toolchains/$ANRDOID_TOOLCHAIN/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar 
export LD=$NDKROOT/toolchains/$ANRDOID_TOOLCHAIN/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ld 
export CC=$NDKROOT/toolchains/$ANRDOID_TOOLCHAIN/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc 
export CXX=$NDKROOT/toolchains/$ANRDOID_TOOLCHAIN/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++ 
export RANLIB=$NDKROOT/toolchains/$ANRDOID_TOOLCHAIN/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ranlib 

echo "AR: " $AR 
echo "LD: " $LD 
echo "CC: " $CC 
echo "CXX: " $CXX 

[[ ! -d "$NDKROOT" || ! -f "$AR" || ! -f "$LD" || ! -f "$CC" || ! -f "$CXX" ]] && echo "Make sure AR, LD, CC, CXX variables are defined correctly. Ensure NDKROOT is defined also" && exit -1 

./autogen.sh 

#if [ $? -ne 0 ] 
#then 
# exit 1 
#else 
# echo "autogen success!" 
#fi 

# for ARM 
ANDROID_PLATFORM=android-3 
ANDROID_SYSROOT="$NDKROOT/platforms/${ANDROID_PLATFORM}/arch-arm" 
echo "SYSROOT: " $ANDROID_SYSROOT 

export HWKIND=generic 
export CPPFLAGS="--sysroot=$ANDROID_SYSROOT -DANDROID_HARDWARE_$HWKIND" 
export CFLAGS="--sysroot=$ANDROID_SYSROOT -DANDROID_HARDWARE_$HWKIND" 
export LDFLAGS="--sysroot=$ANDROID_SYSROOT -DANDROID_HARDWARE_$HWKIND" 
export ARFLAGS="--sysroot=$ANDROID_SYSROOT -DANDROID_HARDWARE_$HWKIND" 

./configure \ 
    --prefix=/data/local/Inst \ 
    --host=armv7-unknown-linux --target=armv7-unknown-linux \ 
    --with-tmpdir=/sdcard 

if [ $? -ne 0 ] 
then 
    exit 1 
else 
    echo "configure success!" 
fi 
# note: on android emulator, android-14 platform was also tested and works. 
# It is not clear what this platform nr really is. 

make -j7 
if [ $? -ne 0 ] 
then 
    exit 1 
else 
    echo "build success!" 
fi 

make -j7 install DESTDIR=`pwd`/Inst 
관련 문제