arm64位aarch64 交叉編譯ssh
- 依賴庫
- openssl
-
- 編譯
- 部署
- openssl測試
- zlib
-
- 編譯
- 部署
- openssh
-
- 編譯
- 部署
- 遇到的問題
依賴庫
ssh由openssh交叉編譯
openssh依賴zlib和openssl兩個庫
分别提供壓縮和加密的功能
需要先交叉編譯這兩個庫
網上提到的很多編譯方法似乎都不适用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 [email protected] $^ $(LIBS) $(LIBPATH)
$(Q)echo compiled over
%.o:%.c
$(Q)$(CC) -c $(CFLAGS) $< -o [email protected]
%.o:%.cpp
$(Q)$(CXX) -c $(CFLAGS) $< -o [email protected] $(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
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPrdVWylTMaVHbtFmZk1mYoR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyETO4ITNyQTM3EzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
這些連結随便選一個就可以,似乎第一個比較常用,在這裡找比較新的版本
編譯
./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并沒有發現它依賴這個庫,也沒有發現它的子庫會依賴這個庫