Ubuntu上通过android toolchain交叉编译Valgrind操作步骤
? ? ? 關(guān)于Valgrind的介紹可以參考:https://blog.csdn.net/fengbingchun/article/details/50196189.
? ? ? 這里介紹下在Ubuntu 16.04上通過(guò)android toolchain如android-ndk-r14b交叉編譯Valgrind源碼的操作步驟:
? ? ? 1.?從 https://valgrind.org/ 下載最新的版本3.17.0,解壓縮,并將終端定位到主目錄;
? ? ? 2.?從官網(wǎng)https://developer.android.com/ndk/downloads/older_releases#ndk-14b-downloads下載android-ndk-r14b并解壓縮;
? ? ? 3.?編寫(xiě)腳本build_android.sh,內(nèi)容如下:此腳本既支持armv7也支持aarch64,在valgrind主目錄下執(zhí)行此腳本
#! /bin/bashif [ $# != 1 ]; thenecho "usage: $0 system_architect"echo "e.g: build armv7: $0 0; build aarch64: $0 1"exit 1
fiif [ $1 != 0 -a $1 != 1 ]; thenecho "input param can only be 0 or 1: \"$0 0\" or \"$0 1\""exit 1
fitoolchain_path=${HOME}/Disk/Soft/android-ndk-r14b
echo "toolchain path: ${toolchain_path}"if [ $1 == 0 ]; thenecho "build android armv7"export AR=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-arexport LD=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ldexport CC=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gccexport CXX=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++export RANLIB=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlibexport STRIP=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-stripbash autogen.shCPPFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm" \CFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm" \./configure \--prefix=/ \--host=armv7-unknown-linux \--target=armv7-unknown-linux \--with-tmpdir=/sdcardmake -j4make install DESTDIR=`pwd`/install_armv7
fiif [ $1 == 1 ]; thenecho "build android aarch64"export AR=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-arexport LD=${toolchain_path}/ttoolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ldexport CC=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gccexport CXX=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++export RANLIB=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlibexport STRIP=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-stripbash autogen.shCPPFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm64" \CFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm64" \./configure \--prefix=/ \--host=aarch64-unknown-linux \--target=aarch64-unknown-linux \--with-tmpdir=/sdcardmake -j4make install DESTDIR=`pwd`/install_aarch64
fi
? ? ? 4.?解決編譯時(shí)的error:oredump-elf.c:149:4:?error:?conflicting?types?for?'Elf32_Nhdr',修改源碼coregrind/m_coredump/coredump-elf.c,將文件中結(jié)構(gòu)體名Elf32_Nhdr調(diào)整為Elf32_Nhdr_,此結(jié)構(gòu)體好像并沒(méi)有用到
? ? ? 5.?執(zhí)行完腳本后,會(huì)在valgrind主目錄下生成install_armv7和install_aarch64目錄,結(jié)構(gòu)如下:bin目錄下存放著valgrind可執(zhí)行文件,libexec/valgrind目錄下存放著所需的動(dòng)態(tài)庫(kù)。注意:(1).valgrind的舊版本動(dòng)態(tài)庫(kù)的存放位置是lib/valgrind目錄;(2).在編譯完armv7或aarch64后,如繼續(xù)編譯另一個(gè)架構(gòu),需先執(zhí)行make clean,再執(zhí)行./build_android.sh 0或./build_android.sh 1
?? ? ? 6.?將install_armv7或install_aarch64拷貝到手機(jī)上,查看valgrind版本,結(jié)果如下:可見(jiàn)valgrind執(zhí)行正確。注意:(1).新版本valgrind的VALGRIND_LIB為./install_aarch64/libexec/valgrind,在舊版本中為./install_aarch64/lib/valgrind;(2).當(dāng)測(cè)試的可執(zhí)行文件依賴(lài)其它動(dòng)態(tài)庫(kù)時(shí),需要用LD_LIBRARY_PATH指定依賴(lài)動(dòng)態(tài)庫(kù)所在的目錄;(3).如在執(zhí)行過(guò)程中,遇到類(lèi)似以下錯(cuò)誤時(shí)"valgrind:?Can't?create?client?cmdline?file?in?/data/local/tmp/valgrind_proc_xxxx_cmdline_yyyyyyyy",在原有命令基礎(chǔ)上,添加TMPDIR=.?即可,如TMPDIR=.?VALGRIND_LIB=./install_aarch64/libexec/valgrind?LD_LIBRARY_PATH=target/android-aarch64/ ./install_aarch64/bin/valgrind --leak-check=full --log-file=log.txt ./build/CppBaseTest
?
?
總結(jié)
以上是生活随笔為你收集整理的Ubuntu上通过android toolchain交叉编译Valgrind操作步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python3中None用法
- 下一篇: Python3中with用法