- 交叉编译nss库
编译QT时发现要求NSS >= 3.26 is required. 而系统里的nss库只有2.x ,故查阅了相关资料,发现对nss交叉编译的资料较少.
文中涉及到交叉编译器和库的路径以自己实际路径为准.
- nss以及依赖库下载地址
记得下载补丁
NSS Dependencies Required:
PS:当时下载的是nss3.50,nspr4.25
- 交叉编译nspr流程
首先交叉编译nss的依赖库nspr
#此目录用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流程
PS:下载nss库
的同时还得下载nss补丁
#此目录用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
原因:makefie没法生成
chk文件
.解决办法:
- 方法一:(具体参考评论区的方法).在nss-3.53/nss/cmd/shlibsign/Makefile 90行附近可以看到ifeq ($(CROSS_COMPILE),1)
进行处理:在OS_TARGET=Android的时候可以编译时候指定CROSS_COMPILE=1,而其他平台的话需要手动指定CROSS_COMPILE=1.- 方法二:手动拷贝chk到目标生成目录,已达到跳过此步骤的目的.
- 方法三:删除makefie中生成chk文件的部分代码
此时安装完成,需要转移库的位置,路径根据自己需求调整即可.
../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