编译过程

脚本如下

#!/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

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐