ssh由openssh交叉编译
openssh依赖zlib和openssl两个库
分别提供压缩和加密的功能
需要先交叉编译这两个库
网上提到的很多编译方法似乎都不适用aarch64,这里重新总结一下
可以从官方的github下载比较新的release版本
https://github.com/openssl/openssl/releases
下载tar.gz压缩包
<配置自己工具链的环境变量>
<保证aarch64-linux-gnu- tab键能自动补全就可以,不需要CROSS_COMPILE CC CXX等环境变量>
tar -xzf openssl-OpenSSL_1_1_1a.tar.gz
cd openssl-OpenSSL_1_1_1a/
./Configure linux-aarch64 --cross-compile-prefix=aarch64-linux-gnu- --prefix=/home/wjk/install/openssl shared
make
make install
这里比较容易出问题的是./Configure,四下寻找才找到正确的配置方法
执行make install后会将生成的文件复制到选定路径,主要包括
sudo cp -a 可以保留动态库的软连接
将lib里面的共享库需要复制到机器里面,并且添加共享库的搜索路径
我的机器是放到了/usr/openssl/lib里面
在/etc/profile添加这个库的搜索路径
export SSL_LDPATH=/usr/openssl/lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SSL_LDPATH
可以写简单的代码测试ssl是否可以正确工作
ssltest.cpp
#include
#include
#include
int main(int argc,char*argv[])
{
unsigned char buf[10];
int num = 10;
int res;
res = RAND_bytes(buf,num);
if(res == 1)
{
printf("Succeed to generate rand with openssl\n");
for(const auto &i:buf)
{
printf("%0x\n",i);
}
}
else
printf("fail to generate,wrong with openssl\n");
return 0;
}
makefile如下
CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
Q =
CFLAGS = -g -Wall -std=c++11
TARGET = ssltest
SRC = ssltest.cpp
LIBS := -lssl -lcrypto
LIBPATH := -L ../../install/openssl/lib/
INCLUDE := -I ../../install/openssl/include/
OBJ := $(subst .cpp,.o,$(SRC))
OBJ := $(subst .c,.o,$(OBJ))
$(TARGET):$(OBJ)
$(Q)$(CC) -o $@ $^ $(LIBS) $(LIBPATH)
$(Q)echo compiled over
%.o:%.c
$(Q)$(CC) -c $(CFLAGS) $< -o $@
%.o:%.cpp
$(Q)$(CXX) -c $(CFLAGS) $< -o $@ $(INCLUDE)
.PHONY:clean
clean:
rm -f *.o
rm -f $(TARGET)
zlib是负责压缩的库
可以从官网下载源码,他们似乎提供交叉编译好的库,but我还是决定自己编译一下
http://www.zlib.net/
需要才能上去官网
https://github.com/djp952/prebuilt-libz
这个文章说了各个平台的编译方法,根据自己的需求做了修改
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=aarch64-linux-gnu-gcc
export AR=aarch64-linux-gnu-ar
export RANLIB=aarch64-linux-gnu-gcc-ranlib
CFLAGS="-fPIC" ./configure --shared --prefix=/home/wjk/install/zlib
make
make install
-fPIC是说生成位置无关码,其他和openssl类似
类似sudo cp -a 命令共享库复制到机器端/usr/zlib/lib里面
修改/etc/profile
export SSL_LDPATH=/usr/openssl/lib/
export ZLIB_LDPATH=/usr/zlib/lib/
export LD_LIBRARY_PATH=$SSL_LDPATH:$ZLIB_LDPATH
官网下载
https://www.openssh.com/portable.html
这些链接随便选一个就可以,似乎第一个比较常用,在这里找比较新的版本
./configure --host=aarch64-linux-gnu --with-zlib=/home/wjk/install/zlib --with-ssl-dir=/home/wjk/install/openssl --disable-etc-default-login
make
这里的–host就说明了工具链的前缀,另外还需要指定刚刚编译的zlib和openssl的路径
注意:openssh不需要make install
openssh的部署步骤略复杂
可以参考这个文章
https://www.veryarm.com/892.html
在最后一步我遇到了一些问题,
运行ssh的各种命令都会报错
No user exists for uid 0
这个据说是ssh无法读取/etc/passwd这个文件导致
我的原因是缺少了libnss_file这个库导致的,增加了以后就可以了
比较奇怪的是我用aarch64-linux-gnu-readelf -d ssh并没有发现它依赖这个库,也没有发现它的子库会依赖这个库