编译三方库

一、编译 openssl

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
42
43
44
45
46
47
48
49
50
51
准备阶段
wget --no-check-certificate -c https://www.openssl.org/source/old/1.1.1/openssl-1.1.1o.tar.gz
tar -xzf openssl-1.1.1o.tar.gz
cd openssl-1.1.1o
mkdir build-aarch64 && cd build-aarch64

设置交叉编译环境
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib
# 假设这些交叉编译工具链安装到了 '/usr/bin' 目录下,这一句不要漏掉
export PATH=/usr/bin:$PATH

编译
aarch64,编译动态库
../Configure linux-aarch64 --debug \
-DOPENSSL_NO_OPENSSL_MEMORY -DOPENSSL_NO_BUF_FREELISTS \
-DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DOPENSSL_NO_INLINE -DOPENSSL_NO_AUTOLOAD_CONFIG \
-DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_COMP -DOPENSSL_NO_ENGINE -DOPENSSL_NO_STATIC_ENGINE \
-DOPENSSL_NO_HW -DOPENSSL_NO_SSL2 -DOPENSSL_NO_SSL3 -DOPENSSL_NO_TLS1 -DOPENSSL_NO_TLS1_1 \
-DOPENSSL_NO_WEAK_SSL_CIPHERS \
no-tests no-asm no-autoload-config no-deprecated no-zlib no-comp no-engine no-static-engine \
no-ssl2 no-ssl3 no-tls1 no-tls1_1 no-hw no-crypto-mdebug \
--prefix=/data/App/toolchain/target/out_aarch64/openssl-1.1.1o \
--openssldir=/data/App/toolchain/target/out_aarch64/openssl-1.1.1o

make depend
make -j8
make install # 才可以安装到设置的目录中

编译 x86
export CC=gcc
export CXX=g++
export LD=ld
export AR=ar
export AS=as
export RANLIB=ranlib

../Configure linux-x86_64 --debug \
-DOPENSSL_NO_OPENSSL_MEMORY -DOPENSSL_NO_BUF_FREELISTS \
-DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DOPENSSL_NO_INLINE -DOPENSSL_NO_AUTOLOAD_CONFIG \
-DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_COMP -DOPENSSL_NO_ENGINE -DOPENSSL_NO_STATIC_ENGINE \
-DOPENSSL_NO_HW -DOPENSSL_NO_SSL2 -DOPENSSL_NO_SSL3 -DOPENSSL_NO_TLS1 -DOPENSSL_NO_TLS1_1 \
-DOPENSSL_NO_WEAK_SSL_CIPHERS \
no-tests no-asm no-autoload-config no-deprecated no-zlib no-comp no-engine no-static-engine \
no-ssl2 no-ssl3 no-tls1 no-tls1_1 no-hw no-crypto-mdebug \
--prefix=/data/App/toolchain/target/out_x86_64/openssl-1.1.1o \
--openssldir=/data/App/toolchain/target/out_x86_64/openssl-1.1.1o

二、编译 perl

1
2
3
4
5
6
7
8
9
curl -L -O http://www.cpan.org/src/5.0/perl-5.34.0.tar.gz
curl -L -O https://github.com/arsv/perl-cross/releases/download/1.3.6/perl-cross-1.3.6.tar.gz
tar -zxf perl-5.34.0.tar.gz
cd perl-5.34.0
tar --strip-components=1 -zxf ../perl-cross-1.3.6.tar.gz

./configure --prefix=/usr/local/perl-5.34.0 --target=aarch64-linux-gnu -Dldflags="-s -static" -Dusethreads -Duselargefiles -Dusestrict --all-static
make -j4
make install
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
42
43
44
45
46
47
48
49
交叉编译:https://github.com/arsv/perl-cross

# Get perl and perl-cross sources
curl -L -O http://www.cpan.org/src/5.0/perl-5.24.1.tar.gz
curl -L -O https://github.com/arsv/perl-cross/releases/download/1.1.3/perl-cross-1.1.3.tar.gz

# Unpack perl-cross over perl, overwriting Makefile
tar -zxf perl-5.24.1.tar.gz
cd perl-5.24.1
tar --strip-components=1 -zxf ../perl-cross-1.1.3.tar.gz

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

# Proceed as usual with most autoconfed packages
# 如果创建 build_aarch64 目录的话,configure 的时候会出错
./configure --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64/perl-5.24.1 -Duseshrplib
make -j10
make install


-------
以下方法编译未成功
wget http://www.cpan.org/src/5.0/perl-5.36.0.tar.gz
tar -xzf perl-5.36.0.tar.gz && cd perl-5.36.0

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

./Configure -des -Dusethreads -Dcrosscompile -Dcc=aarch64-linux-gnu-gcc -Dld=aarch64-linux-gnu-ld -Dprefix=/usr/local/perl-5.36.0 aarch64-linux-gnu
make
sudo make install

# 编译的时候出现错误:Your C compiler doesn't seem to be able to compile C99 code
1. 尝试指定编译器使用 GNU C99 扩展。-Dccflags=-std=gnu99
./Configure -des -Dusethreads -Dcrosscompile -Dcc=aarch64-linux-gnu-gcc -Dld=aarch64-linux-gnu-ld -Dccflags=-std=gnu99 -Dprefix=/data/App/toolchain/target/out_aarch64/perl-5.36.0 aarch64-linux-gnu
不行,依然是这个报错
2. 尝试添加 -Dno_c99 选项来禁用 C99 特性
../Configure -des -Dusethreads -Dcrosscompile -Dcc=aarch64-linux-gnu-gcc -Dld=aarch64-linux-gnu-ld -Dno_c99 -Dprefix=/data/App/toolchain/target/out_aarch64/perl-5.36.0 aarch64-linux-gnu

../Configure -des -Dusethreads -Dcrosscompile -Dtargetarch=aarch64-linux-gnu -Dcc=aarch64-linux-gnu-gcc -Dld=aarch64-linux-gnu-ld -Dprefix=/data/App/toolchain/target/out_aarch64/perl-5.36.0

三、编译 file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
wget http://ftp.astron.com/pub/file/file-5.32.tar.gz
tar -xzf file-5.32.tar.gz && cd file-5.32
mkdir build

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

../configure --host=aarch64-linux-gnu --target=aarch64-linux-gnu --enable-static --disable-shared --prefix=/data/App/toolchain/target/out_aarch64/file-5.32
make -j10
make install

编译出来的 file,查看文件,都是报错:file: could not find any valid magic files!
原因:file 命令需要 magic 文件来确定文件类型。magic 文件通常位于 /usr/share/file/magic 或 /usr/share/misc/magic 目录下。但是,有时也可能将 magic 文件存储在其他位置,具体取决于系统的配置。
使用 file -v 查看默认使用 magic 文件的位置。将编译生成的 share 中的 magic file 拷贝到指定位置即可。

四、编译 libunwind

1
2
3
4
5
6
7
8
9
10
11
12
下载 libunwind 源码 版本 1.6.2

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

../configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64/libunwind-1.6.2 --enable-shared --disable-static

../configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/data/App/toolchain/target/out_x86_64/libunwind-1.6.2 --enable-shared --disable-static

五、编译 Graphviz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/7.1.0/graphviz-7.1.0.tar.gz
tar -xzf graphviz-7.1.0.tar.gz
cd graphviz-7.1.0
mkdir build_aarch64 && cd build_aarch64

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

../configure --prefix=/data/App/toolchain/target/out_aarch64/graphviz-7.1.0 --host=aarch64-linux-gnu --target=aarch64-linux-gnu
make -j10
make install

六、编译 gcc

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
42
43
44
45
46
47
48
49
50
51
52
1. x86_64 版本的编译

export CC=gcc
export CXX=g++
export LD=ld
export AR=ar
export AS=as
export RANLIB=ranlib

export LIBRARY_PATH=

../configure --prefix=/data/App/toolchain/target/out_x86_64/gcc_7.5.0-asan_modidy \
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \
--enable-languages=c,c++ \
--disable-multilib

make -j8
make install

2. aarch64 版本的编译

wget -c https://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz
gcc 的依赖库:
wget -c https://ftp.gnu.org/gnu/mpfr/mpfr-4.0.1.tar.xz
wget -c https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz
wget -c https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
wget -c ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2
wget -c ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.16.1.tar.gz

# gcc依赖库的处理
mv cloog-0.18.1 gcc-8.2.0/cloog
mv gmp-6.1.2 gcc-8.2.0/gmp
mv mpfr-4.0.1 gcc-8.2.0/mpfr
mv isl-0.18 gcc-8.2.0/isl
mv mpc-1.1.0 gcc-8.2.0/mpc

安装适用于 aarch64 架构的交叉编译工具链,以便在 x86 上生成 aarch64 代码。
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

export LIBRARY_PATH=

../configure --prefix=/data/App/toolchain/target/out_aarch64/gcc_7.5.0-asan_modidy \
--build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu \
--enable-languages=c,c++ \
--disable-multilib

七、编译 curl-7.83.1

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
export CC=gcc
export CXX=g++
export LD=ld
export AR=ar
export AS=as
export RANLIB=ranlib

# 使用 --enable-debug 调试的时候可以达到跟踪代码的需求
# --without-nss 是因为自带的 curl 支持的 https 是 nss 版本,不是 openssl 的,我们需要用 openssl 版本的
# 可以使用 curl -V 查看
# --with-ssl 指定 openssl 的安装位置
../configure --enable-debug --prefix=/data/App/toolchain/target/out_x86_64/curl-7.83.1 --without-nss --with-ssl=/data/App/toolchain/target/out_x86_64/openssl-1.1.1o
sudo make && sudo make install

2. 编译 aarch64

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

export PKG_CONFIG_PATH=/data/App/toolchain/target/out_aarch64/openssl-1.1.1o/lib/pkgconfig

../configure --target=aarch64-linux-gnu --host=aarch64-linux-gnu --build=x86_64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64/curl-7.83.1 --with-ssl=/data/App/toolchain/target/out_aarch64/openssl-1.1.1o --without-libidn2 --enable-shared --disable-static --with-pic=yes --disable-ldap --disable-ldaps --without-libidn --without-librt --without-zlib --without-nss --enable-debug


八、编译 jsoncpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 1. 编译 x86_64
git clone git@github.com:open-source-parsers/jsoncpp.git
git checkout 1.9.5
mkdir build_x86_64 && cd build_x86_64
cmake ..
make -j10

2. 编译 aarch64

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

cmake -DCMAKE_INSTALL_PREFIX=/data/App/toolchain/target/out_aarch64/jsoncpp_1.9.5 ..
make && make install

六、编译 systemd

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
git clone git@github.com:systemd/systemd.git
git checkout v253
sudo apt update
sudo apt-get install build-essential bison meson
pip3 install --upgrade meson
sudo apt-get install libmount-dev
sudo apt-get install libpthread-stubs0-dev

1. 编译 x86_64 gcc 7.5.0

export CC=gcc
export CXX=g++
export LD=ld
export AR=ar
export AS=as
export RANLIB=ranlib

./configure --prefix=/data/App/toolchain/target/out_x86_64/systemd_v253 --buildtype=release
会生成 build 目录。cd build
ninja

遇到问题:
/usr/bin/ld: /usr/local/lib/libcurl.a(libcurl_la-curl_threads.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
中止编译

七、编译 eudev

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
wget --no-check-certificate https://dev.gentoo.org/\~blueness/eudev/eudev-3.2.5.tar.gz

1. 编译 x86_64 gcc 7.5.0

export CC=gcc
export CXX=g++
export LD=ld
export AR=ar
export AS=as
export RANLIB=ranlib

mkdir build_x86_64 && cd build_x86_64
../configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/data/App/toolchain/target/out_x86_64/eudev_3.2.5
make -j10
make install

2. 编译 aarch64 gcc 7.5.0

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

mkdir build_aarch64 && cd build_aarch64
../configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64/eudev_3.2.5 --disable-blkid --disable-kmod
make -j10
make install

3. 编译 aarch64 gcc 9.2.1

export CC=aarch64-none-linux-gnu-gcc
export CXX=aarch64-none-linux-gnu-g++
export LD=aarch64-none-linux-gnu-ld
export AR=aarch64-none-linux-gnu-ar
export AS=aarch64-none-linux-gnu-as
export RANLIB=aarch64-none-linux-gnu-ranlib

../configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64_gcc921/eudev_3.2.5 --disable-blkid --disable-kmod

八、编译 gperftools

https://www.cnblogs.com/vaughnhuang/p/16187371.html

九、编译 pcap

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
42
43
44
45
http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz

1. 编译 x86_64 gcc 7.5.0
export CC=gcc
export CXX=g++
export LD=ld
export AR=ar
export AS=as
export RANLIB=ranlib

mkdir build_x86_64 && cd build_x86_64
../configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/data/App/toolchain/target/out_x86_64/libpcap-1.8.1
make -j10
make install

2. 编译 aarch64 gcc 7.5.0

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

mkdir build_aarch64 && cd build_aarch64
../configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64/libpcap-1.8.1 --with-pcap=linux
make -j10
make install


3. 编译 aarch64 gcc 9.2.1

export PATH=/opt/toolchain_9.2.1/bin:$PATH

export CC=aarch64-none-linux-gnu-gcc
export CXX=aarch64-none-linux-gnu-g++
export LD=aarch64-none-linux-gnu-ld
export AR=aarch64-none-linux-gnu-ar
export AS=aarch64-none-linux-gnu-as
export RANLIB=aarch64-none-linux-gnu-ranlib

mkdir build_aarch64_gcc_921 && cd build_aarch64_gcc_921
../configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64_gcc921/libpcap-1.8.1 --with-pcap=linux
make -j10
make install

十、编译 htop

1
2
3
4
5
6
7
8
9
10
11
12
2. 编译 aarch64  gcc 7.5.0

export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export AR=aarch64-linux-gnu-ar
export AS=aarch64-linux-gnu-as
export RANLIB=aarch64-linux-gnu-ranlib

mkdir build_aarch64 && cd build_aarch64
../configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu --prefix=/data/App/toolchain/target/out_aarch64/htop-2.2.0 --disable-unicode