httping 段错误问题总结

发布时间:2026/9/15 8:41:48

httping 段错误问题总结 项内容现象在板子上执行httping命令含空跑立刻 Segmentation fault结论-pie链接 目标文件未-fPIE→ TEXTREL → 启动重定位写只读段 →SEGV_ACCERR状态已修复并在板端验证通过1. 现象设备上执行/bin/httping不带任何参数即段错误。带 URL 的测速命令同样段错误。strace显示依赖库加载成功后在动态链接阶段崩溃尚未进入有效业务逻辑。典型 strace 尾部open(/usr/lib/libextservice.so, ...) 3 mmap2(... PROT_READ|PROT_EXEC ...) ... mmap2(... PROT_READ|PROT_WRITE ...) ... mprotect(..., PROT_READ) 0 # 各库 RELRO mprotect(..., PROT_READ) 0 mprotect(..., PROT_READ) 0 --- SIGSEGV {si_codeSEGV_ACCERR, si_addr0x49xxxx} --- killed by SIGSEGV 要点SEGV_ACCERR权限错误典型为写只读页不是缺页、也不是简单 OOM。si_addr随 ASLR 变化但相对主程序镜像的偏移固定落在 RX /.rodata一带。2. 根因2.1 直接原因链接编译结果CMakeLDFLAGS含-pie几乎所有.o没有-fPIEPIE 非 PIC 目标文件ELF 带DT_TEXTREL数百个R_ARM_RELATIVE落在RX 只读 LOAD启动时写只读段 → 段错误用readelf可见修复前Flags: PIE且存在TEXTREL指向非可写 LOAD 的 reloc 数量约672各.o以R_ARM_ABS32为主几乎没有 PIC 类重定位2.2 为何会编成这样CMake 为安全加固给 httping 加了-pie并把-fPIE放进C_CFLAGS。patch-httping-2.2.1/Makefile里原先只有在CONFIG_HSAN下、且仅对main.o使用C_CFLAGS。CMake 调用 make 时未传入CONFIG_HSANy旧Makefile.hsan会传。于是所有目标文件走默认规则只有CFLAGS/OFLAGS含头文件路径没有-fPIE再与-pie链接。对比历史可工作路径Makefile.hsan的LDFLAGS不含-pie非 PIC 目标文件链成普通可执行文件可以正常跑。CMake 路径引入-pie却未保证全量-fPIE从而引入本问题。2.3 与若干误判的关系猜测结论板子仍是旧httping排除md5sum/ 大小与 PC strip 产物一致libextservice.so未更新曾误用「25764旧」排除strip 后本就约 25KBmd5 与 PC 一致系统内存不足 /malloc(128KB)失败排除MemAvailable 充足崩溃点在链接收尾interpret_url里char in_use[65536]栈溢出排除空跑不进该函数该问题另作加固栈改堆仍保留3. 定位过程按时间线概括排查路径板端空跑即崩 → md5/大小对照确认已是新二进制 → free/meminfo排除内存不足 → 空跑路径分析排除 interpret_url 大栈 → strace定位到动态库加载后、SEGV_ACCERR → readelf -d/-r/-l发现 TEXTREL 大量 RX 段 reloc → 检查 .o 重定位类型确认未 -fPIE → 对照 Makefile.hsan / CMakeLists / Makefile找到 -pie 与 -fPIE 不一致 → 全量 -fPIE 重编TEXTREL0板端恢复正常关键命令分析侧# 动态标志与 TEXTRELreadelf-dhttping|grep-ETEXTREL|FLAGS|NEEDED# 程序头RX / RW LOADreadelf-lhttping# 目标文件是否 PICreadelf-rmain.o tcp.o|grep-cR_ARM_ABS32# 板端strace-fhttping21|tail-40md5sum /bin/httping /usr/lib/libextservice.so4. 修复内容涉及文件ubus8.8 / ubus7.20 均已改open_source/local/httping/CMakeLists.txtmake 增加CONFIG_HSANyOFLAGS、C_CFLAGS均加入-fPIE继续使用-pie链接open_source/local/httping/patch-httping-2.2.1/Makefile统一规则%.o: %.c使用$(CFLAGS) $(C_CFLAGS)保证所有目标文件带-fPIE修复后检查DT_TEXTREL消失写入非可写 LOAD 的 reloc 数量为0板端httping→No URL/host to ping given5. 重编与验证说明必须带prebuild_httping否则不会重新覆盖补丁目录。本次根因修复只需重编 httping不必重编libextservice。产物路径local/httping/rootfs/usr/bin/httping板端验证md5sum /bin/httping httping# 期望No URL/host to ping given6. 经验教训-pie与-fPIE必须成对只链 PIE、不编 PIC在 musl 上极易在启动阶段因 TEXTREL 直接 SIGSEGV。Make 变量与编译宏不是一回事CC上的-DCONFIG_HSANy只影响 C 预处理Makefile 的ifdef CONFIG_HSAN需要 make 侧传入CONFIG_HSANy。strip 后体积不能当版本依据libextservice.sostrip 前后可从 ~98KB 变为 ~25KB应以 md5 / 同源编译产物为准。空跑即崩优先怀疑加载/链接stracereadelf比先改业务逻辑更高效。补丁目录中的interpret_url大栈改堆仍建议保留属于另一类潜在栈溢出风险与本次空跑段错误不是同一根因。7.完整因果链① 编译时未加-fPIE → 目标文件含绝对地址代码是位置相关的 ↓ ② 链接时加了-pie → 链接器要求生成位置无关可执行文件 → 矛盾出现 ↓ ③ 链接器的选择 ├─ 现代链接器直接报错recompile with -fPIE└─ 老链接器妥协生成 TEXTREL → 在.text 段留下重定位项 ↓ ④ 程序启动ld.so 处理重定位 → 重定位项指向.text → 必须修正.text 里写死的绝对地址 ↓ ⑤ ld.so 写.text →.text 权限是 R-X只读可执行 → 写入触发 page fault ↓ ⑥ 内核 page fault handler 判定 → 地址有效已映射 → 权限不对只读页要写 → 发送 SIGSEGVsi_codeSEGV_ACCERR ↓ ⑦ 程序崩溃8. 总结根本原因编译时没加 -fPIE链接时却加了 -pie链接器被迫在只读的 .text 段留下重定位项TEXTREL启动时动态链接器要改写 .text但 .text 只读写入触发 page fault内核判定权限错误发送 SIGSEGVsi_code SEGV_ACCERR。核心理解.text 不是绝对地址它是代码段问题是 .text 里的代码写了绝对地址重定位要修正这些写死的地址修正位置就在 .text 里.text 只读一写就段错误正常 PIE 把绝对地址放到可写的 .got 里重定位只改 .got解决办法编译和链接选项配套要么全 -fPIE -pie要么全 -no-pie。
延伸阅读

更多相关文章

2026/9/15 8:41:48

CEO融资能力构建:从BP到估值谈判全流程指南

1. 项目概述:CEO融资能力构建指南融资能力已成为现代企业掌舵者的核心生存技能。作为连续创业者,我见证过太多项目因创始人融资能力不足而错失发展良机。本文将系统拆解融资全流程中的关键环节,从BP撰写到估值谈判,分享一套经过实…

2026/9/15 8:51:54

Ryzen AI MAX+395不是显卡:Windows 11统一内存与AI加速原理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 8:51:54

固定资产从采购到入账怎么管理?申请、验收、建卡和财务确认

采购订单写了10台笔记本,到货后实际收了9台,另1台下周补发;发票又可能晚到。若采购、验收、资产卡和财务凭证各自独立录入,系统很容易出现“已经折旧却没验收”或“实物在用但台账没有”的断层。 以一张采购订单为例:…

2026/9/15 8:51:54

桥接模式实战:Java实现支付系统多维度解耦设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码