/*********************************************************************
* Author : lile
* Modified : 2019年12月28日星期六 10:16:13
* Email : [email protected]
* HomePage : lile777.blog.csdn.net
* CopyRight : 該文章版權由lile所有。
* 保留本版權聲明的前提下,可在非商業目的下任意傳播和複製。
* 對於商業目的下對本文的任何行爲需經作者同意。
*********************************************************************/
目錄
1,主機環境
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
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
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 自動生成編譯文件
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編譯測試
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平臺交叉編譯
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庫版本不兼容
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 [email protected] ##
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系統,編譯不通過
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系統,編譯不通過。
(也可能沒找到正確指令,看文檔也支持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
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