依赖库

ssh由openssh交叉编译
openssh依赖zlibopenssl两个库
分别提供压缩和加密的功能
需要先交叉编译这两个库

网上提到的很多编译方法似乎都不适用aarch64,这里重新总结一下

openssl

编译

可以从官方的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,四下寻找才找到正确的配置方法

  • linux-aarch64是指定平台,
  • –cross-compile-prefix是工具链前缀
  • –prefix是执行make install的安装路径
  • shared是指定要生成共享库

执行make install后会将生成的文件复制到选定路径,主要包括

  • bin里面是几个工具
  • include里面是头文件,我们在PC上交叉编译时将需要指定这个头文件搜索路径
  • lib里面是静态库和共享库
  • share和ssl里面不知道是什么,似乎是文档

部署

sudo cp -a 可以保留动态库的软连接
将lib里面的共享库需要复制到机器里面,并且添加共享库的搜索路径
我的机器是放到了/usr/openssl/lib里面
在/etc/profile添加这个库的搜索路径

export SSL_LDPATH=/usr/openssl/lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SSL_LDPATH

openssl测试

可以写简单的代码测试ssl是否可以正确工作
ssltest.cpp

#include <stdio.h>
#include <string.h>
#include <openssl/rand.h>

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

zlib是负责压缩的库
可以从官网下载源码,他们似乎提供交叉编译好的库,but我还是决定自己编译一下
http://www.zlib.net/
需要vpn才能上去官网

编译

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

openssh

官网下载
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并没有发现它依赖这个库,也没有发现它的子库会依赖这个库

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐