最近因为公司安全的需求, 要修改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
, 确认可以正常运行, 至此大功告成.