最近在做嵌入式平台上的 Chromium 移植工作,由于 Chromium 在 Linux 平台下需要依赖系统的 NSS 库,但是目标平台并没有这个库,只好自己移植一下。
获取最新的 Mozilla NSS 库源码包,这里我们下载 NSS NSPR 二合一包:
1 2 3 | wget https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_43_RTM/src/nss-3.43-with-nspr-4.21.tar.gz tar -zxvpf nss-3.43-with-nspr-4.21.tar.gz cd nss-3.43 |
由于 NSS 依赖 NSPR,我们需要首先编译 NSPR 库:
1 2 3 4 5 | cd nspr CC=arm-none-linux-gnueabi-gcc CCC=arm-none-linux-gnueabi-g++ \ AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib \ ./configure --target=arm-linux --cache-file=/dev/null --prefix=$PWD/../dist make && make install |
由于 NSS 库的编译脚本默认使用 GYP 编译,需要先配置一下环境:
1 2 | cd ~/ && git clone https://chromium.googlesource.com/external/gyp export PATH=$HOME/gyp:$PATH |
先修改一下 coreconf/shlibsign.py 这个脚本,将下面一行注释,不然报错:
1 | # subprocess.check_call([os.path.join(bin_path, 'shlibsign'), '-v', '-i', lib_file], env=env, stdout=dev_null, stderr=dev_null) |
然后就可以开始编译 NSS 库了:
1 2 3 4 | cd nss CC=arm-none-linux-gnueabi-gcc CCC=arm-none-linux-gnueabi-g++ \ AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib \ ./build.sh --with-nspr=$PWD/../dist/include/nspr:$PWD/../dist/lib --target=arm |
注:nss-3.43/dist 为编译 out 目录,编译完后 include/lib 都在里面了。
嘻哈猴
大神,再下有几个疑问?
1.chromium69版本使用了大量c++14的语法,而目前gcc要5.0版本才完全支持,我看你交叉编译工具链才4.9,我之前尝试用4.9编译会报很多语法错误,我用clang在linux上也根本编译不了。
2.你知道nss库怎么添加公钥和私钥吗?
darkgod
1. 事实上,交叉编译可以使用 chromium 自带的 clang 编译器来完成,然后静态链接 libc++,这样可以彻底解决交叉编译工具链不支持 c++14 语法的问题;当然,这个过程也会用到交叉工具链(gcc) ,其作用不是用来编译,而是提供库函数的头文件;gcc 工具链包里的 libc 目录可以作为 chromium 编译的 sysroot。
2. nss库是以数据库的形式来存储公钥和私钥的,可以通过其附带的工具 certutil 和 pk12util 来将公钥和私钥导入数据库,具体步骤可参考这篇 wiki。
杨飞
请教您一个问题。
交叉编译nss
root@xxzh:~/tools/nss-3.45/nss# CC=arm-linux-gnueabihf-gcc CCC=arm-linux-gnueabihf-g++ \
> AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib \
> ./build.sh –with-nspr=/root/tools/nss-3.45/nspr/install/include/nspr:/root/tools/nss-3.45/nspr/install/lib –target=arm
执行后,输出如下后,一直卡着:
log: ninja version 0.1.3 initializing
log: magic group: gid=0 (root)
log: entering main loop
log: generating initial pid array..
log: now monitoring process activity
。。。
执行后移植卡在了这里。
您知道是什么情况吗,谢谢
darkgod
没有遇到你这个问题。从 log 看我猜测是 ninja 版本太低了,你可以升级成高版本的试一下。
jacob
有个问题请教一下,指定sysroot后,通过clang来编译arm64的版本时候,你们有遇到这个error: “Unknown __WORDSIZE detected”吗?
错误信息/mysysroot/usr/include/bits/wordsize.h:46:2: error: “Unknown __WORDSIZE detected”
看了一下对应的文件是arch相关的宏没有定义(如__aarch64__),但这些宏不应该是编译时自动加上的吗?是不是还有什么需要配置?