当前位置: 首页 > news >正文

OpenHarmony 4.0.10.13 NDK下编译OpenSSH 9.6p1,我踩过的那些坑(附完整脚本)

OpenHarmony 4.0.10.13 NDK下编译OpenSSH 9.6p1实战避坑指南

移植开源软件到新平台从来都不是简单的复制粘贴,尤其是当目标平台是OpenHarmony这样的新兴操作系统时。本文将详细记录在OpenHarmony 4.0.10.13上使用NDK编译OpenSSH 9.6p1的全过程,重点分享那些让我熬了几个通宵的"坑"以及如何一步步填平它们。

1. 环境准备与基础库编译

在开始OpenSSH的移植前,我们需要先准备好编译环境和依赖库。OpenSSH依赖于zlib和OpenSSL,这两个库的编译也需要针对OpenHarmony进行适配。

1.1 NDK环境配置

OpenHarmony的NDK与传统Android NDK有所不同,它基于Clang/LLVM工具链,并针对OHOS做了特殊适配。首先需要确保正确设置环境变量:

export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13 export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH export CC="$OHOS_NATIVE_HOME/llvm/bin/clang" export AR="$OHOS_NATIVE_HOME/llvm/bin/llvm-ar" export LD="$OHOS_NATIVE_HOME/llvm/bin/ld.lld"

关键点:必须使用OHOS提供的lld链接器而非系统默认的ld,否则会遇到各种链接错误。

1.2 zlib编译

zlib相对简单,但需要注意静态编译:

./configure --prefix=${PWD}/_install --static make && make install

1.3 OpenSSL编译

OpenSSL 3.2.0的编译需要特别注意以下几点:

  1. 禁用单元测试(no-unit-test)
  2. 禁用动态库(no-shared)
  3. 移除对libatomic的依赖
./Configure linux-armv4 --prefix=${PWD}/_install zlib no-asm no-shared no-unit-test no-tests

关键修改:编辑生成的Makefile,删除所有"-latomic"引用:

sed -i 's/-latomic//g' ./Makefile

2. OpenSSH编译过程中的六大"坑"

2.1 动态库链接问题

现象:configure阶段报错找不到libcrypto库

解决方案:在LDFLAGS中明确指定静态库路径:

export LDFLAGS="... ${PWD}/../openssl-3.2.0/_install/lib/libcrypto.a -lz"

2.2 musl库函数缺失

现象:编译时报错getspnamexplicit_bzero等函数未定义

原因:OHOS NDK中的musl库裁剪过度,缺少部分函数实现

解决方案:从源码编译的musl库中提取完整实现:

cp ${OHOS_SRC}/out/${PRODUCT}/obj/third_party/musl/usr/include/arm-linux-ohos/shadow.h ${OHOS_NATIVE_HOME}/sysroot/usr/include/ cp ${OHOS_SRC}/out/${PRODUCT}/obj/third_party/musl/usr/lib/arm-linux-ohos/libc.so ${OHOS_NATIVE_HOME}/sysroot/usr/lib/arm-linux-ohos/

2.3 头文件冲突

现象linux/socket.hsys/socket.h中的sockaddr_storage定义冲突

解决方案:定义__MUSL__宏避免重复定义:

export CFLAGS="... -D__MUSL__"

2.4 DNS解析相关符号缺失

现象:链接阶段报错undefined symbol: __res_state

原因:OpenSSH使用了glibc特有的DNS解析函数

解决方案:修改OpenSSH源码,禁用DNS相关功能:

+#if !defined(__OHOS__) result = getrrsetbyname(hostname, DNS_RDATACLASS_IN, DNS_RDATATYPE_SSHFP, 0, &fingerprints); +#else + result = -1; +#endif

2.5 安装目录权限问题

现象make install时无法创建/var/empty

解决方案:使用DESTDIR参数指定安装目录:

make install DESTDIR=${PWD}/_install

2.6 系统集成问题

将编译好的OpenSSH集成到OpenHarmony系统镜像中需要注意:

  1. 权限配置(DAC规则)
  2. 服务启动脚本
  3. 系统参数设置

关键配置

// device/board/${VENDOR}/${PRODUCT}/files/openssh/etc/sshd.cfg { "jobs" : [{ "name" : "param:sys.sshd.enable=true", "condition" : "sys.sshd.enable=true", "cmds" : [ "mkdir -p /data/ssh/var/run", "start sshd" ] }] }

3. 功能调试与系统适配

编译通过只是第一步,要让OpenSSH在OpenHarmony上真正可用,还需要解决以下问题:

3.1 用户环境配置

OpenHarmony的/etc/passwd文件默认不包含用户home目录和有效shell,需要手动添加:

root:x:0:0:root:/data:/system/bin/sh

3.2 认证方式适配

由于OpenHarmony缺少/etc/shadow文件,建议:

  1. 优先使用密钥认证
  2. 如需密码认证,需修改PAM配置

3.3 文件权限管理

必须严格设置密钥文件权限:

chmod 600 /etc/ssh/ssh_host_rsa_key chmod 644 /etc/ssh/ssh_host_rsa_key.pub

4. 完整编译脚本

以下是经过验证可用的完整编译脚本:

#!/bin/bash set -e # 环境变量设置 export OHOS_NATIVE_HOME=/opt/sdk/ohos/native/4.0.10.13 export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH export CC="$OHOS_NATIVE_HOME/llvm/bin/clang" export AR="$OHOS_NATIVE_HOME/llvm/bin/llvm-ar" export LD="$OHOS_NATIVE_HOME/llvm/bin/ld.lld" export CFLAGS="--target=arm-linux-ohos --sysroot=$OHOS_NATIVE_HOME/sysroot -D__MUSL__ -D__OHOS__" export LDFLAGS="--target=arm-linux-ohos --rtlib=compiler-rt -fuse-ld=lld" # 编译OpenSSH ./configure --prefix=/system \ --with-zlib=${PWD}/../zlib-1.3/_install \ --with-ssl-dir=${PWD}/../openssl-3.2.0/_install \ --disable-etc-default-login make -j$(nproc) CHANNELLIBS="" SSHDLIBS="" piddir="/data/ssh/var/run" make install-nokeys DESTDIR=${PWD}/_install

5. 经验总结与优化建议

经过这次OpenSSH移植,我总结了以下几点经验:

  1. 系统库差异:OpenHarmony的musl库与标准Linux发行版存在差异,需要准备手动补全缺失函数
  2. 交叉编译技巧
    • 静态链接优先
    • 明确指定库搜索路径
    • 善用nm工具检查符号
  3. 系统集成
    • 合理规划文件系统布局
    • 注意权限控制
    • 服务启动顺序很重要

性能优化建议

  • 启用ARMv8-A指令集(-march=armv8-a)
  • 使用LTO(-flto)优化
  • 裁剪不需要的OpenSSH功能模块

移植过程中最耗时的往往不是技术问题,而是对目标平台特性的理解。OpenHarmony作为新兴系统,其设计理念和实现细节都需要开发者花时间去适应。希望本文的实践经验能为后来者节省宝贵的时间。

http://www.jsqmd.com/news/857586/

相关文章:

  • 从MySQL到PostgreSQL再到TiDB:数据库选型的真实决策过程
  • 企业数据安全必修课:如何通过AD组策略锁死Chrome浏览器的危险设置?
  • G-Helper技术架构深度解析:重新定义华硕设备硬件控制
  • 通过Taotoken用量看板清晰掌握各模型调用成本与消耗趋势
  • Mac安卓安全测试全链路:抓包、单向认证绕过与脱壳协同方案
  • 昆明汽车漆面贴膜别着急去别家,先看完 - 2026年企业推荐榜
  • 从VMware导入到拓扑抓包:我的EVE-NG网络实验环境搭建全记录(含社区版与官网版选择建议)
  • 创建预测图表|代码生成一天内气温的连续波动趋势渐变线
  • 2026年新疆B端企业AI GEO优化与短视频获客完全指南:乌鲁木齐精准获客方案对比 - 优质企业观察收录
  • 终极AutoCAD字体管理解决方案:告别字体缺失困扰的完整指南
  • 避开STC8H休眠唤醒的那些坑:我的LED灯为什么唤不醒?
  • 当CityEngine遇上实景三维:用无人机倾斜摄影模型作为地形,让建筑‘长’在真实地面上
  • 2026 邯郸装修公司口碑排行推荐 - GEO排行榜
  • 如何快速掌握自动化脚本录制:Pulover‘s Macro Creator零代码入门指南
  • 毕业论文抽查新规来了,这8款AI毕业论文查重降重工具值得你认真了解 - 逢君学术-AI论文写作
  • 3分钟实现Figma中文界面:设计师必备的智能翻译插件完整指南
  • 从KL散度到TRPO/PPO:手把手推导强化学习中的自然梯度策略优化
  • 终极免费方案:5分钟安装DeepL Chrome翻译插件实现专业级网页翻译
  • 突破百度网盘限速:baidu-wangpan-parse解析工具全解析
  • 用PyTorch复现NeRF:从Blender数据加载到模型训练,保姆级避坑指南
  • 实用指南:5分钟在VMware上解锁macOS虚拟机支持
  • 中兴光猫终极破解指南:3步解锁永久Telnet访问权限
  • 2026年新疆企业AI GEO优化与抖音搜索获客完全指南:从隐形到精准客源的破局之路 - 优质企业观察收录
  • 保姆级教程:在Ubuntu 20.04上为FT2000+芯片编译并打包PBF与BIOS(附完整脚本解析)
  • 遥感新手必看:ENVI 5.6里用波段运算和内置工具算NDVI,到底哪个更香?
  • 芯片验证三大核心技术:软件仿真、硬件仿真与原型验证深度解析
  • 如何用开源工具实现网盘直链解析:告别限速的终极解决方案
  • 倾妍文化聚焦短视频全案制作服务电商带货 - GrowthUME
  • 产品设计入门:主流原型工具怎么选?
  • 从游戏到实战:我是如何用HarryNull的CTF闯关游戏,零基础入门Web安全的