linux交叉编译nss3,nspr库精讲

简介: linux交叉编译nss3,nspr库精讲


  • 交叉编译nss库

编译QT时发现要求NSS >= 3.26 is required. 而系统里的nss库只有2.x ,故查阅了相关资料,发现对nss交叉编译的资料较少.

文中涉及到交叉编译器和库的路径以自己实际路径为准.


  • nss以及依赖库下载地址

nss-3.*.tar.gz.

记得下载补丁

NSS Dependencies Required:

nspr-4.x.tar.gz.

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


目录
相关文章
|
5天前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
|
4月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
108 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
124 3
|
4月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
5月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
168 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4月前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
|
4月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
37 0
|
5月前
|
Linux 编译器 vr&ar
【Linux】静态库和动态库
本文详细介绍了Linux系统中静态库和动态库的概念、区别、制作与使用方法,包括它们在链接时的区别、加载机制以及优缺点。
65 0
|
5月前
|
Linux Shell vr&ar
【linux】详解——库
【linux】详解——库