交叉编译nss库
编译QT时发现要求NSS >= 3.26 is required.
而系统里的nss库只有2.x ,故查阅了相关资料,发现对nss交叉编译的资料较少.
文中涉及到交叉编译器和库的路径以自己实际路径为准.
下载地址
nss-3.50.tar.gz.
http://www.linuxfromscratch.org/patches/blfs/svn/nss-3.50-standalone-1.patch
NSS Dependencies Required:
nspr-4.25.tar.gz.
交叉编译nspr
首先交叉编译nss依赖库nspr
tar -zxvf nspr-4.25.tar.gz
cp -r nspr-4.25 nspr_x64
#此目录用gcc编译
cd ./nspr_x64/nspr/
sed -ri 's#^(RELEASE_BINS =).*#\1#' pr/src/misc/Makefile.in
sed -i 's#$(LIBRARY) ##' config/rules.mk
./configure --with-pthreads --enable-64bit --with-mozilla
make
#安装是因为等会还要make 64位的nss库
make install
#此目录用交叉编译器编译
cd ../../nspr-4.25/nspr/
sed -ri 's#^(RELEASE_BINS =).*#\1#' pr/src/misc/Makefile.in
sed -i 's#$(LIBRARY) ##' config/rules.mk
./configure --with-pthreads \
--prefix=/opt/hisi-linux/x86-arm/lib/nspr \
--host=arm-himix200-linux \
CC=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc \
CXX=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++
make
#此时会报错提示../../../config/./nsinstall: ../../../config/./nsinstall: 无法执行二进制文件
#原因用32位交叉编译器生成的可执行文件nsinstall,pc无法执行
#解决方法:用gcc编译生成的文件进行替换
cp ../../nspr_x64/nspr/config/nsinstall ./config
#继续make
make
make install
依赖库终于装完了,剩下开始交叉编译nss
交叉编译nss
下载nss库的同时还得下载nss补丁
tar -zxvf nss-3.50.tar.gz
cp -r nss-3.50 nss_x64
#此目录用gcc编译
cd ./nss_x64
#用patch命令打补丁
patch -Np1 -i ../nss-3.50-standalone-1.patch
cd nss
#注意自己刚刚用gcc安装的nspr库位置
make -j1 BUILD_OPT=1 \
NSPR_INCLUDE_DIR=/usr/include/nspr \
NSPR_LIB_DIR=/usr/lib/nspr \
USE_STATIC_RTL=1 \
USE_SYSTEM_ZLIB=1 \
ZLIB_LIBS=-lz \
NSS_ENABLE_WERROR=0 \
$([ -f /usr/include/sqlite3.h ] && echo NSS_USE_SYSTEM_SQLITE=1) \
$([ $(uname -m) = x86_64 ] && echo USE_64=1)
#此目录用交叉编译器编译
cd ../../nss-3.50
patch -Np1 -i ../nss-3.50-standalone-1.patch
cd nss
#参数没指定zlib和sqlite库的路径,需要确保自己的交叉编译器能找到.
make -j1 \
CC=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc \
CCC=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++ \
BUILD_OPT=1 \
NSPR_INCLUDE_DIR=/opt/hisi-linux/x86-arm/lib/nspr/include/nspr \
NSPR_LIB_DIR=/opt/hisi-linux/x86-arm/lib/nspr/lib \
NSS_USE_SYSTEM_SQLITE=1 \
NSS_ENABLE_WERROR=0 \
USE_SYSTEM_ZLIB=1 \
USE_STATIC_RTL=1 \
OS_TEST=arm
#此时make报错:/bin/sh: 行 2:
#../../coreconf/nsinstall/Linux5.3_aarch64_arm-himix200-linux-gcc_glibc_PTH_64_OPT.OBJ/nsinstall: 无法执行二进制文件: 可执行文件格式错误
#报错原因与nspr库相同,所以也用pc的gcc编译一个生成可执行文件进行替换
cp ../../nss_x64/nss/coreconf/nsinstall/Linux5.3_x86_64_cc_glibc_PTH_64_OPT.OBJ/nsinstall ./coreconf/nsinstall/Linux5.3_arm_arm-himix200-linux-gcc_glibc_PTH_OPT.OBJ/nsinstall
#继续上面的执行make设置
"make"
#然后还会出错,不过是过了好一会
#arm_arm-himix200-linux-gcc_glibc_PTH_OPT.OBJ/shlibsign: 无法执行二进制文件: 可执行文件格式错误
cp ../../nss_x64/nss/cmd/shlibsign/Linux5.3_x86_64_cc_glibc_PTH_64_OPT.OBJ/shlibsign ./cmd/shlibsign/Linux5.3_arm_arm-himix200-linux-gcc_glibc_PTH_OPT.OBJ/shlibsign
#继续上面的执行make设置
"make"
#成功
#可能遇到的其他错误
#arm-himix200-linux-gcc: error: unrecognized argument in option '-march=armv8-a+crypto'
#arm-himix200-linux-gcc: error: unrecognized command line option '-m32'
//遇到这两个错误都是交叉编译器和所选的设备类型不匹配.
# [../../../dist/Linux5.3_arm_arm-himix200-linux-gcc_glibc_PTH_OPT.OBJ/lib/libsoftokn3.chk] Error 1
//不知道具体的错误原因,反正没法生成chk文件,涉及到的都报错.
此时安装完成,需要转移库的位置,路径根据自己需求调整
$ cd ../dist/Linux5.3_arm_arm-himix200-linux-gcc_glibc_PTH_OPT.OBJ
# install -v -m755 lib/*.so /lib/nss/lib
# install -v -m644 lib/{*.chk,libcrmf.a} /lib/nss/lib
# install -v -m755 -d /lib/nss/include
# cp -v -RL ../{public,private}/nss/* /lib/nss/include
# chmod -v 644 /lib/nss/*
# install -v -m755 bin/{certutil,nss-config,pk12util} /opt/hisi-linux/x86-arm/arm-himix200-linux/bin
# install -v -m644 lib/pkgconfig/nss.pc /opt/hisi-linux/x86-arm/arm-himix200-linux/target/usr/lib/pkgconfig