ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SerenityOS 移植 PCRE:深入解析 pcretest `-S` 选项禁用补丁与 setrlimit 支持现状

SerenityOS 移植 PCRE:深入解析 pcretest `-S` 选项禁用补丁与 setrlimit 支持现状 SerenityOS 移植 PCRE深入解析 pcretest-S选项禁用补丁与 setrlimit 支持现状【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity本文以 SerenityOS 仓库中 Ports/pcre/patches/ReadMe.md 为骨架完整解析其记录的唯一补丁0001-test-Disable-S-on-serenity.patch为什么 SerenityOS 上必须禁用 pcretest 的-S选项、该补丁的具体改动内容、其背后setrlimit()在系统 LibC 中的真实实现状态以及 pcre 端口在 Ports 体系中的构建与打补丁机制。读完本文你将掌握 SerenityOS 移植第三方软件时用补丁规避系统能力缺口的完整方法论。一、背景pcre 端口与它的补丁清单SerenityOS 的 Ports 体系允许把大量第三方软件移植到该系统上运行。每个端口目录下包含一个package.sh构建脚本以及可选的patches/补丁目录。PCREPerl Compatible Regular Expressions库作为基础的正则表达式依赖其端口位于 Ports/pcre 目录。该目录结构如下Ports/pcre/ ├── package.sh # 端口构建脚本 └── patches/ ├── 0001-test-Disable-S-on-serenity.patch # 唯一的补丁 └── ReadMe.md # 补丁说明文档补丁说明文档 全文精炼核心信息只有一条0001-test-Disable-S-on-serenity.patchtest: Disable-Son serenity — 该选项使用了setrlimit()而 SerenityOS 不支持它。这短短两行背后牵涉到 pcretest 工具的参数语义、SerenityOS 资源限制接口的实现现状以及 Ports 的补丁应用机制。下面逐层展开。二、补丁逐行解析把__serenity__加进不支持 -S的平台清单补丁文件 是一个标准的 git format-patch 格式补丁完整内容如下From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner gbeutnerserenityos.org Date: Fri, 14 Jan 2022 16:13:16 0330 Subject: [PATCH] test: Disable -S on serenity This flag uses setrlimit(), which is not supported. --- pcretest.c | 2 - 1 file changed, 1 insertion(), 1 deletion(-) diff --git a/pcretest.c b/pcretest.c index c1ee128..1ebab82 100644 --- a/pcretest.c b/pcretest.c -3168,7 3168,7 while (argc 1 argv[op][0] -) ((stack_size get_value((pcre_uint8 *)argv[op1], endptr)), *endptr 0)) { -#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS) #if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS) || defined(__serenity__) printf(PCRE: -S not supported on this OS\n); exit(1); #else补丁的实质是一次单行条件编译改动可以拆解为三层理解改动位置pcretest.c中命令行参数解析循环while (argc 1 argv[op][0] -)处理-S选项的分支。从补丁上下文可以推断-S选项后面跟随一个通过get_value()解析出的stack_size其意图是设置测试程序的栈大小stack size。改动方式在原有的#if defined(...)平台排除清单中追加defined(__serenity__)。原本不受支持-S的平台包括_WIN32、WIN32、__minix、NATIVE_ZOS、__VMS现在 SerenityOS 加入了这个行列。改动效果在 SerenityOS 上运行pcretest -S size时程序不再尝试执行setrlimit()相关逻辑而是直接打印PCRE: -S not supported on this OS并以状态码 1 退出——与 Windows、Minix 等平台行为完全一致。三、为什么必须禁用setrlimit()在 SerenityOS 的实现现状补丁提交信息给出的理由是This flag uses setrlimit(), which is not supported.这一论断可以在当前仓库的 LibC 实现中得到印证。查看 Userland/Libraries/LibC/ulimit.cpp 中getrlimit/setrlimit两个函数的实现// Userland/Libraries/LibC/ulimit.cpp int getrlimit([[maybe_unused]] int resource, rlimit* rl) { rl-rlim_cur RLIM_INFINITY; rl-rlim_max RLIM_INFINITY; return 0; } int setrlimit([[maybe_unused]] int resource, [[maybe_unused]] rlimit const* rl) { return 0; }关键事实setrlimit()在 SerenityOS 的 LibC 中是一个空实现函数体直接return 0对传入的resource与rl参数完全忽略标注[[maybe_unused]]调用不会产生任何实际效果getrlimit()同样不查询任何真实资源限制而是把rlim_cur与rlim_max一律填为RLIM_INFINITY无限后直接返回成功函数原型定义在 Userland/Libraries/LibC/sys/resource.hint setrlimit(int, struct rlimit const*);接口存在但语义是占位式的。这意味着 pcretest 的-S选项即使在 SerenityOS 上调用成功设置的栈大小也不会真正生效。如果保留-S而不加处理测试程序会带着一个假装生效的栈限制继续运行行为不可预期且与上游在其他平台的语义不一致。因此移植者选择在编译期直接禁用该选项让 pcretest 在 SerenityOS 上的行为与其他不支持setrlimit()的平台保持统一——这是本次补丁设计的核心思路。从源码结构看SerenityOS 的setrlimit/getrlimit目前更接近 API 占位stub而非完整实现这也是 pcretest 的-S选项无法正常工作的根本原因。四、补丁如何生效Ports 体系的 patch 机制要理解这个补丁在构建流程中扮演的角色需要先了解 Ports/README.md 描述的端口构建机制。每个端口通过 package.sh 脚本声明元数据。pcre 端口的脚本内容如下#!/usr/bin/env -S bash ../.port_include.sh portpcre version8.45 useconfiguretrue use_fresh_config_subtrue files( https://downloads.sourceforge.net/project/pcre/pcre/${version}/pcre-${version}.tar.gz#4e6ce03e0336e8b4a3d6c2b70b1c5e18590a5673a98186da90d4f33c23defc09 ) configopts( --with-sysroot${SERENITY_INSTALL_ROOT} )该脚本声明的关键信息version8.45移植的是 PCRE 8.45 版本useconfiguretrue启用 autoconf 风格的configure配置步骤use_fresh_config_subtrue打补丁阶段会使用新版的config.sub替换原包自带的旧文件以识别*-serenity目标三元组files中的URL#SHA256格式下载 pcre 8.45 源码包并用4e6ce03e...c09这个 SHA256 哈希校验完整性configopts传入--with-sysroot${SERENITY_INSTALL_ROOT}配合configopts机制--host${SERENITY_ARCH}-serenity总是被自动附加确保交叉编译时头文件与库文件指向 SerenityOS 的 sysroot。补丁的应用发生在patch阶段。根据 Ports/README.md 的说明patchApply the ports patches (patches/*.patch). A file.foo_appliedis created inworkdirupon success to ensure a certain patch is only applied once.即构建系统自动扫描Ports/pcre/patches/*.patch按文件名顺序应用所有补丁每个补丁成功应用后会在工作目录workdir默认即pcre-8.45生成一个.foo_applied标记文件防止同一补丁被重复应用补丁的剥离层级由patchlevel变量控制默认值为1即patch -p1与本补丁中a/pcretest.c、b/pcretest.c的标准 git 格式相匹配。因此0001-test-Disable-S-on-serenity.patch会在 pcre 源码解压后、configure运行前被自动应用把pcretest.c中的条件编译宏改写为 SerenityOS 兼容版本。五、实战在 SerenityOS 构建环境中安装 pcre 端口如果你已经按 BuildInstructions.md 构建好 SerenityOS 并处于构建环境Meta/serenity.sh提供的环境或等效的构建 shell中安装 pcre 端口的完整流程如下cd Ports/pcre ./package.sh不带参数运行./package.sh等价于依次执行installdepends、fetch、patch、configure、build、install适用于常规安装fetch下载 pcre 8.45 源码包并校验 SHA256然后解压patch自动应用 patches/0001-test-Disable-S-on-serenity.patch在pcre-8.45/下生成.foo_applied标记同时按use_fresh_config_subtrue的设定替换config.subconfigure运行configure --host${SERENITY_ARCH}-serenity --with-sysroot${SERENITY_INSTALL_ROOT}build默认以make -j$(nproc)并行编译install以make install DESTDIR${SERENITY_INSTALL_ROOT}安装到系统镜像根目录。如需分步调试可以单独执行某个阶段例如./package.sh patch只应用补丁。若想确认补丁是否生效可在patch阶段后检查工作目录中的.foo_applied标记文件或直接查看解压后的pcretest.c中是否出现了defined(__serenity__)。pcre 端口当前没有声明depends依赖属于基础库级别的独立端口可作为其他需要正则表达式能力的软件如 grep、编辑器类工具的依赖基础。六、延伸这条补丁思路对其他移植工作的启发虽然这份 补丁说明文档 只有寥寥数行但它浓缩了 SerenityOS 移植工作中一类典型问题的解法识别系统能力缺口SerenityOS 的系统调用与 POSIX 接口仍在持续完善中setrlimit这类接口存在、语义占位的 API 是移植第三方软件时的高频踩坑点对齐上游平台惯例PCRE 上游本身已经为 Windows、Minix、z/OS、VMS 等平台预留了-S的禁用分支SerenityOS 移植者只需把__serenity__追加进既有清单改动面最小、维护成本最低保留可诊断行为禁用分支没有静默忽略参数而是打印PCRE: -S not supported on this OS并退出让用户在 SerenityOS 上遇到-S用法时能立即获得明确反馈。如果需要为其他端口编写类似的补丁可以参考 Ports/README.md 的 How do I contribute? 一节以及./package.sh dev开发模式该模式提供补丁引导导入、版本迁移辅助并在退出时提示是否重新生成补丁说明文档保持patches/ReadMe.md与补丁文件同步更新正是当前 pcre 端口目录所展示的规范形态。七、小结本文围绕 Ports/pcre/patches/ReadMe.md 展开完整还原了0001-test-Disable-S-on-serenity.patch的来龙去脉pcretest 的-S选项依赖setrlimit()而该函数在 SerenityOS 的 LibC 实现 中仍是占位式空操作因此移植者通过一行条件编译把__serenity__并入不支持-S的平台清单使行为与上游其他受限平台对齐。结合 package.sh 与 Ports/README.md 的机制说明你也掌握了该补丁在fetch → patch → configure → build → install全流程中的生效位置以及类似的系统能力缺口在后续移植工作中应该如何被识别与规避。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表