最近因为公司安全的需求, 要修改openssh的源码, 将其移植到一个ARM的嵌入式系统上, 替换原有的预编译的版本. 参考了网上的一些移植openssh的资料, 如openssl官网编译安装说明; 移植openssh到arm-linux, 但是由于目标平台不一样, 实践起来并不能完全参考, 会有细微的差异. 这里把整个流程写下来, 总结一下, 方便后面移植相关开发工具.
下载源码
openssh的编译依赖于openssl, zlib两个库, 因此编译的第一步是把所有这些源码都下载过来, 三个开源仓库下载路径如下:
openssh: git仓库以及各个release版本, https://www.openssh.com/portable.html; 由于release版本才有Configure脚本, 因此我直接下载了一个v6.6p1的稳定版本openssl: 包含github仓库以及文档说明, https://www.openssl.org/; github上的源码基本包含了历史分支信息, 因此可以直接通过git clone下载, 然后checkout到对应版本的分支(使用v1.0.1版本)z-lib: 官网上有下载链接, https://zlib.net/; github上也有仓库, 但是没有历史分支信息, 所以下载了版本zlib-1.2.11的源码.
openssh的INSTALL文档中对所要求的openssl/z-lib版本有具体说明, 可以参考.
由于目标移植平台已有的openssh使用的版本是OpenSSH_6.6p1, 因此实际下载的源码版本信息如下:
openssh: Openssh_6.6p1openssl: OpenSSL_1_0_1-stablez-lib: zlib-1.2.11
1 |
|
编译源码
为了方便管理以及查看编译结果, 可以把三个软件包解压放到一个目录: /data/wxn/openSSH. 本地机器CPU是x86_64, 操作系统是Ubuntu16, 目标平台是armv7架构, 交叉编译使用的工具是arm-none-linux-gnueabi-gcc(gcc 4.6.2).
编译zlib
进入/data/wxn/openSSH/zlib-1.2.11, 通过./configure -h查看编译配置说明:
1 |
|
如果只需要生成静态库, 就指定参数--static; 另外需要指定生成文件的路径:
1 |
|
上述指令生成编译的Makefile后, 修改其中的编译工具, 将其指向交叉编译工具所在的路径(需要修改gcc/ar两个工具的路径):
1 |
|
执行make;make install, 在目录/data/wxn/openSSH/lib下可以看到生成了一个libz.a的静态库.
编译openssl
编译openssl会稍微麻烦点. 同样查看./Configure -h可以看到, 需要配置目标平台的系统类型:
1 |
|
编译配置Configure中已经添加了很多平台类型(./Configure LIST可以查看已经支持的平台), 但是好像并没有发现armv7架构的平台, openssl官网建议自己手动添加一个配置, 但看了其他地方说可以使用相似平台的配置, 看配置列表跟arm相关的有android-armv7/linux-armv4两个, 尝试了armv4发现是可以(android-armv7会出现编译错误):
1 |
|
修改生成的Makefile, 按照之前的zlib配置, 将其中gcc/nm/ar的地方都指向交叉编译工具所在的目录, 执行make; make install, 即可看到/data/wxn/openSSH生成了lib/bin两个目录, lib目录包含了libssl.a/libcrypto.a静态库, bin下包含了openssl工具.
编译openssh
编译openssh跟之前两个库的编译类似(具体可以参考INSTALL文档), 只不过需要指定生成的openssl/zlib所在目录(进入代码根目录):
1 |
|
接着执行make(不用执行安装指令make install), 可以看到根目录下多了ssh/sshd/scp等工具.将其拷贝到目标平台对应目录/usr/local/bin, 确认可以正常运行, 至此大功告成.