三方库socat-1.8.0.3在OH5.1上的适配
编译过程
脚本如下
#!/bin/bash
set -e
: "${NATIVE_LLVM_DIR:="$HOME/opt/native/llvm"}" # LLVM工具链默认路径
: "${TARGET_HOST:="aarch64-unknown-linux-ohos"}" # 目标平台
: "${INSTALL_PREFIX:="$HOME/opt/out/armv8"}" # 安装目录
: "${OPT_PREFIX:="$HOME/opt"}" # opt目录
# 编译器路径
CC_PATH="$NATIVE_LLVM_DIR/bin/${TARGET_HOST}-clang"
CXX_PATH="$CC_PATH++"
# openssl依赖路径
OPENSSL_LIB_DIR="$INSTALL_PREFIX/lib"
OPENSSL_INC_DIR="$INSTALL_PREFIX/include"
# 确保安装路径和opt目录存在
if [ ! -d "$INSTALL_PREFIX" ];then
mkdir -p "$INSTALL_PREFIX"
fi
if [ ! -d "$OPT_PREFIX" ];then
mkdir -p "$OPT_PREFIX"
fi
# ------------ 环境配置 ------------
export CC="$CC_PATH"
export CXX="$CXX_PATH"
export LDFLAGS="-L$OPENSSL_LIB_DIR"
export CPPFLAGS="-I$OPENSSL_INC_DIR"
# ------------ openssl源码获取 ------------
cd "$OPT_PREFIX"
wget https://www.openssl.org/source/openssl-3.0.16.tar.gz
tar -xzvf openssl-3.0.16.tar.gz
cd openssl-3.0.16
# ------------ openssl编译构建 ------------
./Configure linux-aarch64 \
--prefix=$INSTALL_PREFIX \
no-asm
make -j"$(nproc --all)"
make install
# ------------ openssl清理 ------------
make distclean
cd "$OPT_PREFIX"
rm -rf "$OPT_PREFIX/openssl-3.0.16"
rm "$OPT_PREFIX/openssl-3.0.16.tar.gz"
# ------------ socat源码获取 ------------
cd "$OPT_PREFIX"
wget http://www.dest-unreach.org/socat/download/socat-1.8.0.3.tar.gz
tar -xzvf socat-1.8.0.3.tar.gz
cd socat-1.8.0.3
# ------------ 在脚本中直接嵌入补丁内容 ------------
cat > socat_fix.patch << 'EOF'
--- filan.c 2025-03-23 20:26:54.511463485 -0700
+++ filan_dest.c 2025-03-23 20:29:26.905683401 -0700
@@ -461,10 +461,6 @@
struct str_list modnames;
int i;
- if (!isastream(fd)) {
- fprintf(outfile, "\t(no STREAMS modules)");
- return 0;
- }
#if 0 /* uncomment for debugging */
fprintf(outfile, "\tfind=%d", ioctl(fd, I_FIND, "ldterm"));
#endif
EOF
# 应用补丁(自动处理错误)
patch -p0 < socat_fix.patch || { echo "错误:补丁应用失败!"; exit 1; }
rm socat_fix.patch # 清理临时补丁文件
# ------------ socat编译构建 ------------
./configure --prefix="$INSTALL_PREFIX" \
--host=arm-linux \
--disable-resolve \
--disable-res-deprecated \
--disable-posixmq \
--disable-filan \
--enable-openssl
make -j"$(nproc --all)"
make install
# ------------ socat清理 ------------
make distclean
cd "$OPT_PREFIX"
rm -rf "$OPT_PREFIX/socat-1.8.0.3"
rm "$OPT_PREFIX/socat-1.8.0.3.tar.gz"
find "$INSTALL_PREFIX/lib/" -name "*.a" -delete # 递归删除所有 .a 文件
#armv7编译
NATIVE_LLVM_DIR="$HOME/opt/native/llvm" # LLVM工具链默认路径
TARGET_HOST="armv7-unknown-linux-ohos" # 目标平台
INSTALL_PREFIX="$HOME/opt/out/armv7" # 安装目录
OPT_PREFIX="$HOME/opt" # opt目录
# 编译器路径
CC_PATH="$NATIVE_LLVM_DIR/bin/${TARGET_HOST}-clang"
CXX_PATH="$CC_PATH++"
# openssl依赖路径
OPENSSL_LIB_DIR="$INSTALL_PREFIX/lib"
OPENSSL_INC_DIR="$INSTALL_PREFIX/include"
# 确保安装路径存在
if [ ! -d "$INSTALL_PREFIX" ];then
mkdir -p "$INSTALL_PREFIX"
fi
if [ ! -d "$OPT_PREFIX" ];then
mkdir -p "$OPT_PREFIX"
fi
# ------------ 环境配置 ------------
export CC="$CC_PATH"
export CXX="$CXX_PATH"
export LDFLAGS="-L$OPENSSL_LIB_DIR"
export CPPFLAGS="-I$OPENSSL_INC_DIR"
#------------ openssl源码获取 ------------
cd "$OPT_PREFIX"
wget https://www.openssl.org/source/openssl-3.0.16.tar.gz
tar -xzvf openssl-3.0.16.tar.gz
cd openssl-3.0.16
# ------------ openssl编译构建 ------------
./Configure linux-armv4 \
--prefix=$INSTALL_PREFIX \
no-asm
# ------------ Makefile脚本补丁 ------------
cat > make.patch << 'EOF'
--- Makefile 2025-03-24 19:14:17.324984217 -0700
+++ Makefile_dest 2025-03-24 19:15:45.420166314 -0700
@@ -3202,7 +3202,7 @@
CNF_CFLAGS=-pthread
CNF_CXXFLAGS=-std=c++11 -pthread
CNF_LDFLAGS=
-CNF_EX_LIBS=-ldl -pthread -latomic
+CNF_EX_LIBS=-ldl -pthread
# Variables starting with LIB_ are used to build library object files
# and shared libraries.
EOF
# 应用补丁(自动处理错误)
patch -p0 < make.patch || { echo "错误:补丁应用失败!"; exit 1; }
rm make.patch # 清理临时补丁文件
make -j"$(nproc --all)"
make install
# ------------ openssl清理 ------------
make distclean
cd "$OPT_PREFIX"
rm -rf "$OPT_PREFIX/openssl-3.0.16"
rm "$OPT_PREFIX/openssl-3.0.16.tar.gz"
# ------------ socat源码获取 ------------
cd "$OPT_PREFIX"
wget http://www.dest-unreach.org/socat/download/socat-1.8.0.3.tar.gz
tar -xzvf socat-1.8.0.3.tar.gz
cd socat-1.8.0.3
# ------------ 在脚本中直接嵌入补丁内容 ------------
cat > socat_fix.patch << 'EOF'
--- filan.c 2025-03-23 20:26:54.511463485 -0700
+++ filan_dest.c 2025-03-23 20:29:26.905683401 -0700
@@ -461,10 +461,6 @@
struct str_list modnames;
int i;
- if (!isastream(fd)) {
- fprintf(outfile, "\t(no STREAMS modules)");
- return 0;
- }
#if 0 /* uncomment for debugging */
fprintf(outfile, "\tfind=%d", ioctl(fd, I_FIND, "ldterm"));
#endif
EOF
# 应用补丁(自动处理错误)
patch -p0 < socat_fix.patch || { echo "错误:补丁应用失败!"; exit 1; }
rm socat_fix.patch # 清理临时补丁文件
# ------------ socat编译构建 ------------
./configure --prefix="$INSTALL_PREFIX" \
--host=arm-linux \
--disable-resolve \
--disable-res-deprecated \
--disable-posixmq \
--disable-filan \
--enable-openssl
make -j"$(nproc --all)"
make install
# ------------ socat清理 ------------
make distclean
cd "$OPT_PREFIX"
rm -rf "$OPT_PREFIX/socat-1.8.0.3"
rm "$OPT_PREFIX/socat-1.8.0.3.tar.gz"
find "$INSTALL_PREFIX/lib/" -name "*.a" -delete # 递归删除所有 .a 文件
一、前提:确保编译工具链在opt目录下
~/opt
├── native
│ ├── build
│ ├── build-tools
│ ├── docs
│ ├── llvm
│ └── sysroot
└── socat-1.8.0.3.sh
二、socat的构建
socat库依赖openssl库,在脚本中优先构建openssl库
在~/opt目录下执行脚本 ARMV7
./socat-1.8.0.3_arm32.sh
生成的库文件在~opt/out目录下
验 证 文 档
一、将生成的out目录打包
tar -czvf socat-1.8.0.3.tar.gz ./out
二、连接开发板,执行hdc命令将打包好的文件导入开发板
hdc shell mount -o remount,rw /
hdc file send E:\socat-1.8.0.3.tar.gz
三、解压包文件、设置环境变量或者将out目录下的库文件导入到系统库路径下
cd /mnt
mkdir socat_text
cd socat_text
cp /socat-1.8.0.3.tar.gz ./
tar -xzvf socat-1.8.0.3.tar.gz 6
#根据开发板架构选择armv7 or armv8
export LD_LIBRARY_PATH=/mnt/socat_text/out/armv7orarmv8/lib:$LD_LIBRARY_ PATH
四、功能验证
通过openssl工具生成公私钥
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
socat功能验证示例(功能验证需要两块开发板),如下:
数据重定向
创建TCP服务器
socat TCP-LISTEN:8080,fork -
在客户端主机上发送信息
socat - TCP:IP:8080
IP:服务器IP
通过网络传输文件
发送端
socat -u FILE:./test.txt UDP:192.168.31.240:8080
接收端
socat -u UDP-LISTEN:8080 OPEN:./received_file.txt,create
加密发送
socat -u FILE:./local_file.txt OPENSSL-LISTEN:8080,cert=cert.pem,key=key.pem,verify=0,fork,reuseaddr
解密接收
socat -u OPENSSL:192.168.31.79:8080,verify=0,cafile=cert.pem OPEN:./received_file.txt,create
更多推荐

所有评论(0)