天天看點

arm64位aarch64 交叉編譯openssh依賴庫opensslzlibopenssh遇到的問題

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

arm64位aarch64 交叉編譯openssh依賴庫opensslzlibopenssh遇到的問題

這些連結随便選一個就可以,似乎第一個比較常用,在這裡找比較新的版本

編譯

./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并沒有發現它依賴這個庫,也沒有發現它的子庫會依賴這個庫

繼續閱讀