此文章主要用来记录我编译scp工具时的问题以及解决方法。
scp/sshd 来源于openssh开源项目,其依赖与zlib 与 openssl 两个开源工程,有些开源工程不适合用来交叉编译,我不确定原因,可能是用来学习源码或者其他什么功能。
三个开源项目分别使用下述网站下载源码:
wget http://www.zlib.net/zlib-1.3.tar.gz
wget https://www.openssl.org/source/openssl-3.2.0.tar.gz
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.3p1.tar.gz
编译zlib
tar -xvf ../zlib-1.3.tar.gz
cd zlib-1.3/
prefix=~/work/CROSS_COMPILE_TOOL/install_dir/ CC=mips-linux-gnu-gcc CFLAGS="-static -fPIC" ./configure
make
make install
编译openssl
tar -xvf ../openssl-3.2.0.tar.gz
cd openssl-3.2.0
CC=gcc CROSS_COMPILE=mips-linux-gnu- ./config --prefix=~/work/CROSS_COMPILE_TOOL/install_dir/ no-asm linux-mips32
make
make install
tar -xvf ../openssh-8.3p1.tar.gz
cd openssh-8.3p1/
./configure --host=mips-linux-gnu --with-zlib=~/work/CROSS_COMPILE_TOOL/install_dir --with-ssl-dir=~/work/CROSS_COMPILE_TOOL/install_dir LDFLAGS="-static -pthread"
此时会出错,提示:
checking if getpgrp accepts zero args... yes
configure: error: *** working libcrypto not found, check config.log
查看config.log 发现working libcrypto not found 只是配置时的log输出,具体错误是
~work/CROSS_COMPILE_TOOL/install_dir/lib/libcrypto.a(libcrypto-lib-threads_pthread.o): In function `CRYPTO_atom ic_or':
threads_pthread.c:(.text+0x2cc): undefined reference to `__atomic_is_lock_free'
...
分析得知编译的openssl 生产的crypto静态库中使用了一些列的原子操作相关的库,查阅工具链得知,这些函数或变量由libatomic.a库提供,此时去修改 openssh configure文件中这部分的编译检查,加上atomic库则可。
configure 文件 12945
12944 if test "x$openssl" = "xyes" ; then
12945 LIBS="-lcrypto $LIBS"
12946 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
12947 /* end confdefs.h. */
改为
12945 LIBS="-lcrypto -latomic $LIBS"
再重新运行 configure 配置即可成功。
make 可以得到scp 以及sshd等命令。
但是实际放在板子上使用的时候,会报各种错误,
此时有个简单办法,那就是使用轻量级的ssh ->dropbear
地址 :
Index of /dropbear/releases (ucc.asn.au)
也可以直接使用wget,下面这个包是验证过的:
wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2020.81.tar.bz2
...
tar -xvf ../dropbear-2020.81.tar.bz2
cd dropbear-2020.81/
./configure CC=mips-linux-gnu-gcc --with-zlib=../../install_dir --host=mips-linux-gnu LDFLAGS="-static"
make
make scp
此时的scp是可以直接使用的,但会提示
/usr/bin/dbclient: No such file or directory
这个dbclient 是make是编译生成的,把dbclient copy到/usr/bin 目录下scp就可以正常使用了。