十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

SerenityOS 移植 ScummVM:malloc.h 缺失问题的补丁解析与移植实践

SerenityOS 移植 ScummVM:malloc.h 缺失问题的补丁解析与移植实践 SerenityOS 移植 ScummVMmalloc.h 缺失问题的补丁解析与移植实践【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity导读本文围绕 SerenityOS 仓库中 ScummVM 移植所需的补丁集展开核心讲解0001-Do-not-include-malloc.h-on-SerenityOS.patch这一补丁的背景、diff 细节与底层原因SerenityOS 的 C 标准库不提供非标准的malloc.h内存分配函数统一由stdlib.h提供。读者将理解 SerenityOS 的 Ports 移植体系如何工作、为何大量上游项目都需要类似的 malloc.h 处理补丁以及如何借助补丁说明文档与package.sh构建脚本定位并解决此类移植问题。SerenityOS 移植体系与 Ports 目录SerenityOS 采用一套名为Ports的移植机制将第三方开源软件带入该系统。每个移植项目在 Ports 目录下拥有一个独立子目录例如本文主角 Ports/scummvm 目录其内部结构如下Ports/scummvm/ ├── patches/ │ ├── 0001-Do-not-include-malloc.h-on-SerenityOS.patch │ └── ReadMe.md └── package.sh一个标准的移植项目通常包含两部分package.sh构建脚本声明软件版本、下载地址、依赖关系、配置选项与安装步骤patches/目录针对上游源码的本地化补丁每个补丁对应一个编号文件并配套ReadMe.md说明各补丁的用途。这种“补丁 说明文档”的组织方式并非 ScummVM 独有仓库中大量移植项目都遵循同一模式例如 Ports/lzop/patches/ReadMe.md、Ports/powdertoy/patches/ReadMe.md、Ports/npiet/patches/ReadMe.md 与 Ports/serious-sam-classic/patches/ReadMe.md。可见补齐平台差异是第三方软件移植到 SerenityOS 时的常态化工作。补丁说明文档Ports/scummvm/patches/ReadMe.mdPorts/scummvm/patches/ReadMe.md 是 ScummVM 移植补丁的说明文档全文围绕一个补丁展开主题明确文档标题点明这是 “Patches for scummvm on SerenityOS”唯一补丁0001-Do-not-include-malloc.h-on-SerenityOS.patch解决的是malloc.h头文件包含问题文档给出的原因陈述简洁而关键SerenityOS 通过stdlib.h提供标准内存分配函数系统本身不存在malloc.h。这段说明虽然简短却精确概括了补丁存在的全部理由也是后续分析补丁 diff、理解构建失败根因的入口。补丁内容逐行解析补丁文件位于 Ports/scummvm/patches/0001-Do-not-include-malloc.h-on-SerenityOS.patch采用标准 git format-patch 格式包含作者、时间、主题与完整 diffFrom: Jelle Raaijmakers jellegmta.nl Subject: [PATCH] Do not include malloc.h on SerenityOS --- engines/hpl1/engine/libraries/angelscript/sources/as_memory.cpp | 2 - 1 file changed, 1 insertion(), 1 deletion(-) diff --git a/engines/hpl1/engine/libraries/angelscript/sources/as_memory.cpp b/engines/hpl1/engine/libraries/angelscript/sources/as_memory.cpp index 1c624b1..2cf6655 100644 --- a/engines/hpl1/engine/libraries/angelscript/sources/as_memory.cpp b/engines/hpl1/engine/libraries/angelscript/sources/as_memory.cpp -38,7 38,7 #include stdlib.h -#if !defined(__APPLE__) !defined(__SNC__) !defined(__ghs__) !defined(__FreeBSD__) !defined(__OpenBSD__) !defined(__DragonFly__) #if !defined(__APPLE__) !defined(__SNC__) !defined(__ghs__) !defined(__FreeBSD__) !defined(__OpenBSD__) !defined(__DragonFly__) !defined(__serenity__) #include malloc.h #endif修改位置补丁只改动了一个文件engines/hpl1/engine/libraries/angelscript/sources/as_memory.cpp。这是ScummVM 的 HPL1Penumbra引擎内置的 AngelScript 脚本库中的内存管理源文件。AngelScript 在部分平台上通过malloc.h获取额外的分配函数声明因此在该文件中出现了条件包含逻辑。条件编译逻辑的变化修改前后唯一的差异是在原有条件编译宏列表的末尾追加了 !defined(__serenity__)修改前只要目标平台不是 Apple__APPLE__、SN Systems__SNC__、GHS__ghs__、FreeBSD、OpenBSD 或 DragonFly就会包含malloc.h修改后额外排除 SerenityOS。由于 SerenityOS 编译器在构建时定义了__serenity__宏该条件将变为假#include malloc.h这一行被跳过。也就是说该补丁并非删除代码而是把 SerenityOS 加入“不需要malloc.h”的平台白名单与 macOS 和 BSD 系列的处理方式保持一致。为什么需要这个补丁补丁说明文档给出了直接原因SerenityOS 通过stdlib.h提供标准内存分配函数系统不提供malloc.h。这一点可以在仓库的 LibC 头文件中得到印证。查看 Userland/Libraries/LibC/stdlib.h可以看到malloc、calloc、free、realloc、aligned_alloc等标准分配函数均由stdlib.h声明__attribute__((malloc)) __attribute__((alloc_size(1))) void* malloc(size_t); __attribute__((malloc)) __attribute__((alloc_size(1, 2))) void* calloc(size_t nmemb, size_t); void free(void*); __attribute__((alloc_size(2))) void* realloc(void* ptr, size_t); __attribute__((malloc, alloc_size(2), alloc_align(1))) void* aligned_alloc(size_t alignment, size_t size);按照 C 标准malloc/free/calloc/realloc本就属于stdlib.h的声明范畴malloc.h是部分 Unix 系统尤其是 glibc 系 Linux 发行版的非标准扩展头文件。由于 SerenityOS 的 LibC 严格遵循标准组织头文件并未提供这个非标准头若不加处理AngelScript 源码在 SerenityOS 上编译时就会因找不到malloc.h而报错如fatal error: malloc.h: No such file or directory整个 ScummVM 移植将无法通过编译。全仓库视角malloc.h 是一个普遍移植障碍malloc.h缺失并非 ScummVM 独有的问题。在整个 Ports 目录中搜索可以发现大量移植项目都针对这一平台差异打了补丁例如移植项目相关补丁处理方式ScummVM0001-Do-not-include-malloc.h-on-SerenityOS.patch条件编译中排除__serenity__lzop0001-Don-t-try-to-use-malloc.h-header-file-in-the-codebas.patch代码库中不使用malloc.hpowdertoy0001-malloc.h-doesn-t-exist-on-Serenity-but-the-code-only.patch补充 SerenityOS 平台判断npiet0002-Remove-a-malloc.h-include.patch移除malloc.h包含serious-sam-classic0004-Engine-Remove-malloc.h.patch移除该非标准头文件依赖其他头文件间接提供 APIserious-sam-classic 的补丁说明中甚至明确指出malloc.h是一个非标准头文件其所需 API 已经能通过其他头文件的包含链获得因此可以直接移除。这从侧面印证了 SerenityOS 的立场坚持标准 C 头文件布局第三方软件应当避免依赖平台特有的非标准头。从这些案例可以提炼出一条通用的移植经验当上游代码为“非 Apple 且非 BSD”的平台无条件包含malloc.h时移植到 SerenityOS 有两条主流修法条件编译排除法ScummVM 采用在原有平台黑名单中追加 !defined(__serenity__)改动最小适合头文件仅声明少量可用标准库替代的函数直接移除法serious-sam-classic 采用若所需 API 已由stdlib.h等其他标准头提供直接删除该包含行即可代码更简洁。ScummVM 移植的构建上下文package.sh补丁说明聚焦于源码层面的修改而完整的移植还依赖 Ports/scummvm/package.sh 中的构建配置。将该脚本与补丁对照阅读可以完整还原 ScummVM 移植的上下文#!/usr/bin/env -S bash ../.port_include.sh portscummvm useconfiguretrue version2026.3.0 files( https://downloads.scummvm.org/frs/scummvm/${version}/scummvm-${version}.tar.xz#b863a81e1598df8bc4aa0c33e3d9b1c8bbede1879d94d91568a4f200057677e7 ) depends( freetype giflib libiconv libjpeg libmad libmpeg2 libpng libtheora SDL2 ) configopts( --disable-seq-midi --enable-enginemonkey4 --enable-release --with-sdl-prefix${SERENITY_INSTALL_ROOT}/usr/local ) launcher_nameScummVM launcher_categoryGames launcher_command/usr/local/bin/scummvm icon_fileicons/scummvm.ico export CPPFLAGS-fvisibilityhidden function post_install() { # 下载并构建 ScummVM 图标包生成 gui-icons.dat 后复制到安装目录 ... }该脚本揭示了几个与本文主题相关的关键信息补丁的应用时机package.sh通过../.port_include.sh引入 Ports 公共构建框架框架会自动将patches/目录下的补丁应用到解压后的上游源码再执行 configure 与 make。因此0001-*.patch会在编译as_memory.cpp之前生效从源头规避malloc.h缺失问题为何会触发该补丁--enable-enginemonkey4启用 Monkey Island 4 引擎而 HPL1/Penumbra 相关代码含 AngelScript 库属于 ScummVM 内置引擎源码的一部分在整体构建中会被编译因而as_memory.cpp的malloc.h问题无法回避CPPFLAGS 传递脚本额外导出了CPPFLAGS-fvisibilityhidden与补丁一样属于移植期的编译环境适配可见完整的移植往往由“构建脚本配置”与“源码补丁”两部分协同完成安装位置约定launcher_command与post_install均指向/usr/local与 SerenityOS 的 Ports 安装前缀约定一致也和 serious-sam-classic 中“将二进制安装到/usr/local”的补丁目标相呼应。总结与移植启示补丁本质ScummVM 的malloc.h补丁是一处单行条件编译修改把 SerenityOS__serenity__加入无需malloc.h的平台列表与 macOS/BSD 同等对待底层原因SerenityOS 的 LibC 以标准头文件组织为原则malloc/free/calloc/realloc全部由 Userland/Libraries/LibC/stdlib.h 声明系统不提供非标准的malloc.h普遍性这不是孤例lzop、powdertoy、npiet、serious-sam-classic 等移植项目均有同类处理可作为“移植到 SerenityOS”时的可复用参考模式阅读路径建议若要深入理解某一移植建议按patches/ReadMe.md→ 对应.patch文件 →package.sh→ LibC 标准头文件的顺序串联阅读即可从“为什么改”一路追到“底层 API 长什么样”。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表