我是靠谱客的博主 暴躁豌豆,这篇文章主要介绍aarch64平台交叉编译ltrace工具,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
9
10
/********************************************************************* * Author : lile * Modified : 2019年12月28日星期六 10:16:13 * Email : roger0212@163.com * HomePage : lile777.blog.csdn.net * CopyRight : 该文章版权由lile所有。 * 保留本版权声明的前提下,可在非商业目的下任意传播和复制。 * 对于商业目的下对本文的任何行为需经作者同意。 *********************************************************************/

目录

    • 1,主机环境
    • 2,文件下载
      • 2.1 ltrace-0.7.91.tar.bz2
      • 2.2 zlib-1.2.11.tar.gz
      • 2.3 elfutils-0.178.tar.bz2
    • 3,环境依赖与准备
      • 3.1 交叉编译zlib
      • 3.2 交叉编译elfutils
      • 3.3 自动生成编译文件
    • 4,x86编译测试
    • 5,aarch64平台交叉编译
    • 6,踩过的坑
      • 6.1 系统自带elf库版本不兼容
      • 6.2 ltrace-0.7.3版本过时,不支持aarch64系统,编译不通过
      • 6.3 libelf-0.8.13 elf库版本过时,不支持aarch64系统,编译不通过。
    • 7,经验总结
    • 8,Q&A
    • 9,参考

1,主机环境

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@ubuntu:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty root@ubuntu:~# cat /proc/version Linux version 4.4.0-31-generic (buildd@lgw01-43) (gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) ) #50~14.04.1-Ubuntu SMP Wed Jul 13 01:07:32 UTC 2016 root@ubuntu:~# file /bin/busybox /bin/busybox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=ae3cf83d83d4ed554fa7ba6d5f2b17c92c362710, stripped root@ubuntu:~# root@ubuntu:~# aarch64-himix100-linux-gcc -v Using built-in specs. COLLECT_GCC=aarch64-himix100-linux-gcc COLLECT_LTO_WRAPPER=/opt/hisi-linux/x86-arm/aarch64-himix100-linux/host_bin/../libexec/gcc/aarch64-linux-gnu/6.3.0/lto-wrapper Target: aarch64-linux-gnu Configured with: /home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/src/gcc-6.3.0/configure --build=i386-redhat-linux --host=i386-redhat-linux --target=aarch64-linux-gnu --with-arch=armv8-a --prefix=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install --with-specs='%{!ftree-coalesce-vars:-fno-tree-coalesce-vars}' --disable-libmudflap --disable-libssp --enable-gold=yes --disable-libstdcxx-pch --disable-multilib --enable-multiarch --with-gnu-as --with-gnu-ld --enable-libgomp --enable-gnu-indirect-function --enable-checking=yes --enable-lto --enable-c99 --enable-long-long --disable-nls --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --enable-shared --with-pkgversion='HC&C V100R002C00B027_20181107' --enable-languages=c,c++ --with-headers=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/target/usr/include --with-sysroot=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/target --with-build-sysroot=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/target --with-gmp=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-mpfr=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-mpc=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-cloog=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-build-time-tools=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/aarch64-linux-gnu/bin --libdir=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/lib Thread model: posix gcc version 6.3.0 (HC&C V100R002C00B027_20181107)

2,文件下载

2.1 ltrace-0.7.91.tar.bz2

https://github.com/dkogan/ltrace
https://src.fedoraproject.org/repo/pkgs/ltrace/?C=M;O=D

2.2 zlib-1.2.11.tar.gz

http://www.zlib.net/fossils/

2.3 elfutils-0.178.tar.bz2

https://sourceware.org/elfutils/ftp/0.178/

3,环境依赖与准备

3.1 交叉编译zlib

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
time CC=aarch64-himix100-linux-gcc LD=aarch64-himix100-linux-ld RANLIB=aarch64-himix100-linux-ranlib AR=aarch64-himix100-linux-ar ./configure --prefix=/opt/files/release/zlib/aarch64/ make make install root@ubuntu:/opt/files/zlib-1.2.11# tree /opt/files/release/zlib/aarch64/ /opt/files/release/zlib/aarch64/ ├── include │ ├── zconf.h │ └── zlib.h ├── lib │ ├── libz.a │ ├── libz.so -> libz.so.1.2.11 │ ├── libz.so.1 -> libz.so.1.2.11 │ ├── libz.so.1.2.11 │ └── pkgconfig │ └── zlib.pc └── share └── man └── man3 └── zlib.3 6 directories, 8 files

3.2 交叉编译elfutils

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
time CC=aarch64-himix100-linux-gcc LD=aarch64-himix100-linux-ld RANLIB=aarch64-himix100-linux-ranlib AR=aarch64-himix100-linux-ar LDFLAGS='-L/opt/files/release/zlib/aarch64/lib' ./configure --host=aarch64-himix100-linux --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod time make -w CFLAGS+='-I/opt/files/release/zlib/aarch64/include' LDFLAGS="-Wl,-rpath-link,/opt/files/release/zlib/aarch64/lib -L/opt/files/release/zlib/aarch64/lib" time make install root@ubuntu:/opt/files/elfutils-0.178# tree /opt/files/release/elfutils/aarch64/lib/ /opt/files/release/elfutils/aarch64/lib/ ├── libasm-0.178.so ├── libasm.a ├── libasm.so -> libasm.so.1 ├── libasm.so.1 -> libasm-0.178.so ├── libdw-0.178.so ├── libdw.a ├── libdw.so -> libdw.so.1 ├── libdw.so.1 -> libdw-0.178.so ├── libelf-0.178.so ├── libelf.a ├── libelf.so -> libelf.so.1 ├── libelf.so.1 -> libelf-0.178.so └── pkgconfig ├── libdebuginfod.pc ├── libdw.pc └── libelf.pc 1 directory, 15 files

3.3 自动生成编译文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
root@ubuntu:/opt/files/ltrace-0.7.91# bash autogen.sh ---------- autoreconf ---------- autoreconf: Entering directory `.' autoreconf: configure.ac: not using Gettext autoreconf: running: aclocal --force --warnings=all -I config/m4 autoreconf: configure.ac: tracing autoreconf: running: libtoolize --copy --force libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config/autoconf'. libtoolize: copying file `config/autoconf/ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `config/m4'. libtoolize: copying file `config/m4/libtool.m4' libtoolize: copying file `config/m4/ltoptions.m4' libtoolize: copying file `config/m4/ltsugar.m4' libtoolize: copying file `config/m4/ltversion.m4' libtoolize: copying file `config/m4/lt~obsolete.m4' autoreconf: running: /usr/bin/autoconf --force --warnings=all autoreconf: running: /usr/bin/autoheader --force --warnings=all autoreconf: running: automake --add-missing --copy --force-missing --warnings=all configure.ac:56: installing 'config/autoconf/compile' configure.ac:32: installing 'config/autoconf/config.guess' configure.ac:32: installing 'config/autoconf/config.sub' configure.ac:59: installing 'config/autoconf/install-sh' configure.ac:59: installing 'config/autoconf/missing' Makefile.am: installing 'config/autoconf/depcomp' testsuite/Makefile.am:29: warning: user variable 'RUNTESTDEFAULTFLAGS' defined here ... /usr/share/automake-1.14/am/dejagnu.am: ... overrides Automake variable 'RUNTESTDEFAULTFLAGS' defined here autoreconf: Leaving directory `.' -------- Finished -------- root@ubuntu:/opt/files/ltrace-0.7.91#

4,x86编译测试

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
time ./configure --prefix=/opt/files/release/ltrace/x86_64 time make CFLAGS+='-Wno-unused-local-typedefs' time make install root@ubuntu:/opt/files/ltrace-0.7.3# tree /opt/files/release/ltrace/x86_64 /opt/files/release/ltrace/x86_64 ├── bin │ └── ltrace ├── etc │ └── ltrace.conf └── share ├── doc │ └── ltrace │ ├── COPYING │ ├── CREDITS │ ├── INSTALL │ ├── README │ └── TODO └── man ├── man1 │ └── ltrace.1 └── man5 └── ltrace.conf.5 8 directories, 9 files root@ubuntu:/opt/files/ltrace-0.7.3# file /opt/files/release/ltrace/x86_64/bin/ltrace /opt/files/release/ltrace/x86_64/bin/ltrace: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=b46d8b17ed40d165d6e339466237fef6c094f63e, not stripped make uninstall && make distclean

5,aarch64平台交叉编译

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
time CC=aarch64-himix100-linux-gcc LD=aarch64-himix100-linux-ld RANLIB=aarch64-himix100-linux-ranlib AR=aarch64-himix100-linux-ar ./configure --host=aarch64-himix100-linux --prefix=/opt/files/release/ltrace/aarch64/ CPPFLAGS='-I/opt/hisi-linux/x86-arm/aarch64-himix100-linux/target/usr/include/ -I/opt/files/release/elfutils/aarch64/include/ -D__LIBELF64=1' LDFLAGS="-Wl,-rpath-link,/opt/files/release/zlib/aarch64/lib -L/opt/files/release/elfutils/aarch64/lib" time make CFLAGS+='-Wno-unused-local-typedefs' time make install root@ubuntu:/opt/files/ltrace-0.7.91# tree /opt/files/release/ltrace/aarch64/ /opt/files/release/ltrace/aarch64/ ├── bin │ └── ltrace └── share ├── doc │ └── ltrace │ ├── COPYING │ ├── CREDITS │ ├── INSTALL │ ├── README │ └── TODO ├── ltrace │ ├── libacl.so.conf │ ├── libc.so.conf │ ├── libc.so-types.conf │ ├── libm.so.conf │ ├── libpthread.so.conf │ ├── libpthread.so-types.conf │ └── syscalls.conf └── man ├── man1 │ └── ltrace.1 └── man5 └── ltrace.conf.5 8 directories, 15 files root@ubuntu:/opt/files/ltrace-0.7.91# file /opt/files/release/ltrace/aarch64/bin/ltrace /opt/files/release/ltrace/aarch64/bin/ltrace: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.7.0, not stripped root@ubuntu:/opt/files/ltrace-0.7.91# make uninstall && make distclean

6,踩过的坑

6.1 系统自带elf库版本不兼容

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
checking elf.h usability... no checking elf.h presence... yes configure: WARNING: elf.h: present but cannot be compiled configure: WARNING: elf.h: check for missing prerequisite headers? configure: WARNING: elf.h: see the Autoconf documentation configure: WARNING: elf.h: section "Present But Cannot Be Compiled" configure: WARNING: elf.h: proceeding with the compiler's result configure: WARNING: ## --------------------------------------------------- ## configure: WARNING: ## Report this to ltrace-devel@lists.alioth.debian.org ## configure: WARNING: ## --------------------------------------------------- ## checking for elf.h... no configure: error: *** libelf.h or gelf.h not found on your system

6.2 ltrace-0.7.3版本过时,不支持aarch64系统,编译不通过

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@ubuntu:/opt/files/ltrace-0.7.3# cat README Supported Targets ----------------- The following targets are currently (at least somewhat) supported. Some of them may be more or less broken in reality, it is not feasible to test each release comprehensively on each target. i[4567]86-*-linux-gnu ia64-*-linux-gnu m68k-*-linux-gnu mips-*-linux-gnu powerpc-*-linux-gnu powerpc64-*-linux-gnu s390-*-linux-gnu s390x-*-linux-gnu x86_64-*-linux-gnu

6.3 libelf-0.8.13 elf库版本过时,不支持aarch64系统,编译不通过。

复制代码
1
2
3
4
5
(也可能没找到正确指令,看文档也支持64bit ^_^) libelf_0.8.13.orig.tar.gz 146.1 KiB https://launchpad.net/ubuntu/+source/libelf/0.8.13-5

7,经验总结

strace交叉编译2小时就好了,ltrace花了2天时间!!!需要反思的一下:
(1)编译之前先看看文档,确认支持的版本;
(2)出错时认真分析日志文件,比如(config.log、实时打印输出的编译指令),一般会找到出错原因;
(3)交叉编译时思路要清晰,不要把依赖库的版本搞混,用x86_64的库去编译aarch64肯定会有问题;
(4)网上的参考贴好多都是年代久远,对新出的aarch64支持不友好,需要下载最新版本,对照源码文件文档进行编译;
(5)开源软件绝大多数都是用相同的发布机制进行管理的,一般是 autoconf + ./configure 生成Makefile;
(6)需要回炉一下编译、链接的过程,注意 -Wl,-rpath-link,DIR || -Wl,-rpath=DIR || -L DIR|| LD_LIBRARY_PATH=DIR的作用与区别;
(7)尽可能不要动开源软件的代码,大多数问题可以通过指定配置参数来规避。

8,Q&A

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
libtool: compile: aarch64-himix100-linux-gcc -DHAVE_CONFIG_H -I. -I../.. -DSYSCONFDIR="/opt/files/release/ltrace/aarch64/etc" -DPKGDATADIR="/opt/files/release/ltrace/aarch64/share/ltrace" -I../../sysdeps/linux-gnu/aarch64 -I../../sysdeps/linux-gnu -I../../sysdeps -I../.. -I/opt/hisi-linux/x86-arm/aarch64-himix100-linux/target/usr/include/ -I/opt/files/release/libelf/aarch64/include/ -L/opt/files/release/libelf/aarch64/lib -D__LIBELF64=1 -Wall -Wsign-compare -Wfloat-equal -Wformat-security -Werror -g -O2 -MT proc.lo -MD -MP -MF .deps/proc.Tpo -c proc.c -fPIC -DPIC -o .libs/proc.o proc.c: In function 'process_tasks': proc.c:247:3: error: 'readdir_r' is deprecated [-Werror=deprecated-declarations] if (readdir_r(d, &entry, &result) != 0) { ^~ In file included from proc.c:31:0: /opt/hisi-linux/x86-arm/aarch64-himix100-linux/target/usr/include/dirent.h:183:12: note: declared here extern int readdir_r (DIR *__restrict __dirp, ------------ root@ubuntu:/opt/files/ltrace-0.7.91# find . -name "*.c" | xargs grep -rn "readdir_r" ./sysdeps/linux-gnu/proc.c:247: if (readdir_r(d, &entry, &result) != 0) { root@ubuntu:/opt/files/ltrace-0.7.91# vi ./sysdeps/linux-gnu/proc.c +247 244 while (1) { 245 //struct dirent entry; 246 struct dirent *result; 247 if ( NULL == (result = readdir(d)) ) { //if (readdir_r(d, &entry, &result) != 0) { 248 fail: 249 if(tasks) free(tasks); 250 closedir(d); 251 return -1; 252 } 253 if (result == NULL) 254 break;

9,参考

-L、-rpath和-rpath-link的区别 https://blog.csdn.net/q1302182594/article/details/42102961

最后

以上就是暴躁豌豆最近收集整理的关于aarch64平台交叉编译ltrace工具的全部内容,更多相关aarch64平台交叉编译ltrace工具内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部