Ubuntu上通过android toolchain交叉编译Valgrind操作步骤

深藏阁楼爱情的钟 2022-09-03 10:17 409阅读 0赞
  1. 关于Valgrind的介绍可以参考:[https://blog.csdn.net/fengbingchun/article/details/50196189][https_blog.csdn.net_fengbingchun_article_details_50196189].
  2. 这里介绍下在Ubuntu 16.04上通过android toolchainandroid-ndk-r14b交叉编译Valgrind源码的操作步骤:
  3. 1. https://valgrind.org/ 下载最新的版本3.17.0,解压缩,并将终端定位到主目录;
  4. 2. 从官网https://developer.android.com/ndk/downloads/older\_releases\#ndk-14b-downloads下载android-ndk-r14b并解压缩;
  5. 3. 编写脚本build\_android.sh,内容如下:此脚本既支持armv7也支持aarch64,在valgrind主目录下执行此脚本
  6. #! /bin/bash
  7. if [ $# != 1 ]; then
  8. echo "usage: $0 system_architect"
  9. echo "e.g: build armv7: $0 0; build aarch64: $0 1"
  10. exit 1
  11. fi
  12. if [ $1 != 0 -a $1 != 1 ]; then
  13. echo "input param can only be 0 or 1: \"$0 0\" or \"$0 1\""
  14. exit 1
  15. fi
  16. toolchain_path=${HOME}/Disk/Soft/android-ndk-r14b
  17. echo "toolchain path: ${toolchain_path}"
  18. if [ $1 == 0 ]; then
  19. echo "build android armv7"
  20. export AR=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
  21. export LD=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
  22. export CC=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
  23. export CXX=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
  24. export RANLIB=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib
  25. export STRIP=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip
  26. bash autogen.sh
  27. CPPFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm" \
  28. CFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm" \
  29. ./configure \
  30. --prefix=/ \
  31. --host=armv7-unknown-linux \
  32. --target=armv7-unknown-linux \
  33. --with-tmpdir=/sdcard
  34. make -j4
  35. make install DESTDIR=`pwd`/install_armv7
  36. fi
  37. if [ $1 == 1 ]; then
  38. echo "build android aarch64"
  39. export AR=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar
  40. export LD=${toolchain_path}/ttoolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld
  41. export CC=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc
  42. export CXX=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++
  43. export RANLIB=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib
  44. export STRIP=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip
  45. bash autogen.sh
  46. CPPFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm64" \
  47. CFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm64" \
  48. ./configure \
  49. --prefix=/ \
  50. --host=aarch64-unknown-linux \
  51. --target=aarch64-unknown-linux \
  52. --with-tmpdir=/sdcard
  53. make -j4
  54. make install DESTDIR=`pwd`/install_aarch64
  55. fi
  56. 4. 解决编译时的error:oredump-elf.c:149:4: error: conflicting types for 'Elf32\_Nhdr',修改源码coregrind/m\_coredump/coredump-elf.c,将文件中结构体名Elf32\_Nhdr调整为Elf32\_Nhdr\_,此结构体好像并没有用到
  57. 5. 执行完脚本后,会在valgrind主目录下生成install\_armv7install\_aarch64目录,结构如下:bin目录下存放着valgrind可执行文件,libexec/valgrind目录下存放着所需的动态库。注意:(1).valgrind的旧版本动态库的存放位置是lib/valgrind目录;(2).在编译完armv7aarch64后,如继续编译另一个架构,需先执行make clean,再执行./build\_android.sh 0或./build\_android.sh 1

20210809100304646.png

  1. 6. install\_armv7install\_aarch64拷贝到手机上,查看valgrind版本,结果如下:可见valgrind执行正确。注意:(1).新版本valgrindVALGRIND\_LIB为./install\_aarch64/libexec/valgrind,在旧版本中为./install\_aarch64/lib/valgrind;(2).当测试的可执行文件依赖其它动态库时,需要用LD\_LIBRARY\_PATH指定依赖动态库所在的目录;(3).如在执行过程中,遇到类似以下错误时"valgrind: Can't create client cmdline file in /data/local/tmp/valgrind\_proc\_xxxx\_cmdline\_yyyyyyyy",在原有命令基础上,添加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

20210809102048117.png

发表评论

表情:
评论列表 (有 0 条评论,409人围观)

还没有评论,来说两句吧...

相关阅读