news 2026/9/15 8:41:41

httping 段错误问题总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_code=SEGV_ACCERR, si_addr=0x49xxxx} --- +++ 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
  • .oR_ARM_ABS32为主,几乎没有 PIC 类重定位

2.2 为何会编成这样

  1. CMake 为安全加固给 httping 加了-pie,并把-fPIE放进C_CFLAGS
  2. patch-httping-2.2.1/Makefile里,原先只有在CONFIG_HSAN下、且仅对main.o使用C_CFLAGS
  3. CMake 调用 make 时未传入CONFIG_HSAN=y(旧Makefile.hsan会传)。
  4. 于是所有目标文件走默认规则:只有CFLAGS/OFLAGS(含头文件路径),没有-fPIE,再与-pie链接。

对比历史可工作路径:Makefile.hsanLDFLAGS不含-pie,非 PIC 目标文件链成普通可执行文件可以正常跑。CMake 路径引入-pie却未保证全量-fPIE,从而引入本问题。

2.3 与若干误判的关系

猜测结论
板子仍是旧httping排除(md5sum/ 大小与 PC strip 产物一致)
libextservice.so未更新(曾误用「25764=旧」)排除(strip 后本就约 25KB;md5 与 PC 一致)
系统内存不足 /malloc(128KB)失败排除(MemAvailable 充足;崩溃点在链接收尾)
interpret_urlchar 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 重编:TEXTREL=0,板端恢复正常

关键命令(分析侧):

# 动态标志与 TEXTRELreadelf-dhttping|grep-E'TEXTREL|FLAGS|NEEDED'# 程序头:RX / RW LOADreadelf-lhttping# 目标文件是否 PICreadelf-rmain.o tcp.o|grep-cR_ARM_ABS32# 板端strace-fhttping2>&1|tail-40md5sum /bin/httping /usr/lib/libextservice.so

4. 修复内容

涉及文件(ubus8.8 / ubus7.20 均已改):

  • open_source/local/httping/CMakeLists.txt
    • make 增加CONFIG_HSAN=y
    • OFLAGSC_CFLAGS均加入-fPIE
    • 继续使用-pie链接
  • open_source/local/httping/patch-httping-2.2.1/Makefile
    • 统一规则:%.o: %.c使用$(CFLAGS) $(C_CFLAGS),保证所有目标文件带-fPIE

修复后检查:

  • DT_TEXTREL消失
  • 写入非可写 LOAD 的 reloc 数量为0
  • 板端:httpingNo URL/host to ping given

5. 重编与验证

说明:必须带prebuild_httping,否则不会重新覆盖补丁目录。本次根因修复只需重编 httping,不必重编libextservice

产物路径:

local/httping/rootfs/usr/bin/httping

板端验证:

md5sum /bin/httping httping# 期望:No URL/host to ping given

6. 经验教训

  1. -pie-fPIE必须成对:只链 PIE、不编 PIC,在 musl 上极易在启动阶段因 TEXTREL 直接 SIGSEGV。
  2. Make 变量与编译宏不是一回事CC上的-DCONFIG_HSAN=y只影响 C 预处理;Makefile 的ifdef CONFIG_HSAN需要 make 侧传入CONFIG_HSAN=y
  3. strip 后体积不能当版本依据libextservice.sostrip 前后可从 ~98KB 变为 ~25KB,应以 md5 / 同源编译产物为准。
  4. 空跑即崩优先怀疑加载/链接strace+readelf比先改业务逻辑更高效。
  5. 补丁目录中的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 判定 → 地址有效(已映射) → 权限不对(只读页要写) → 发送 SIGSEGV,si_code=SEGV_ACCERR ↓ ⑦ 程序崩溃

8. 总结

根本原因:编译时没加 -fPIE,链接时却加了 -pie,链接器被迫在只读的 .text 段留下重定位项(TEXTREL);启动时动态链接器要改写 .text,但 .text 只读,写入触发 page fault,内核判定权限错误,发送 SIGSEGV,si_code = SEGV_ACCERR。

核心理解:

.text 不是绝对地址,它是代码段;问题是 .text 里的代码写了绝对地址

重定位要修正这些写死的地址,修正位置就在 .text 里

.text 只读,一写就段错误

正常 PIE 把绝对地址放到可写的 .got 里,重定位只改 .got

解决办法:编译和链接选项配套,要么全 -fPIE -pie,要么全 -no-pie。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 8:40:30

FreeManus:基于FastAPI与LangGraph的智能体AI框架解析

1. 项目概述FreeManus是一个面向生产环境设计的智能体式AI系统(Agentic AI System)框架,它基于FastAPI和LangGraph等技术栈构建,旨在为企业级应用提供可扩展、高性能的AI智能体解决方案。这个系统最吸引我的地方在于它巧妙地将Lan…

作者头像 李华
网站建设 2026/9/15 8:38:33

网站建设ag避坑指南:性能优化与安全加固,别再被坑高价

网站建设ag避坑指南:性能优化与安全加固,别再被坑高价 找建站公司最怕什么?不是代码写得烂,而是交钱后网站被黑、被挂马,甚至因为违规被工信部ICP备案系统直接关停。很多老板以为“网站建设ag”就是找个便宜团队把页面搭起来,结果上线不到一个月,网站打不开,或者打开速度慢得像蜗牛,客户全跑了。这时候再回…

作者头像 李华
网站建设 2026/9/15 8:38:18

Elasticsearch ActionListener 核心原理:显式回调链如何替代隐式栈依赖

/* 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:32:40

万维网站域名选型对比评测:3个维度避坑指南

万维网站域名选型对比评测:3个维度避坑指南 域名服务器搞不懂?别急,这确实是创业团队初期最容易踩的坑。很多老板只盯着Logo设计,却忽略了域名背后的技术架构和合规成本,导致后期迁移困难、SEO权重丢失,甚至面临法律风险。今天咱们不整虚的,直接上干货,通过一份硬核的对比评测,帮你把万维网站域名这件事彻…

作者头像 李华
网站建设 2026/9/15 8:28:03

基于Openclaw的员工技能教练:从需求拆解到落地实践

/* 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:27:02

万维网站域名新手入门避坑指南

万维网站域名新手入门避坑指南 改个需求建站公司拖一周,这种憋屈事谁没干过?很多新手入门建站时,总以为买个服务器、传个代码就能上线,结果卡在域名解析和备案环节,急得抓耳挠腮。其实,万维网站域名的配置逻辑远比你想象的复杂,它不仅是网址,更是流量入口和信任背书。…

作者头像 李华