fix(stdio): ensure compatibility with newlib <3.4.0 by handling removed __sdidinit#10791
Conversation
📌 Code Review Assignment🏷️ Tag: componentsReviewers: Maihuanyi Changed Files (Click to expand)
🏷️ Tag: components_libcReviewers: GorrayLi mysterywolf Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2025-10-13 10:52 CST)
📝 Review Instructions
|
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
|
This PR is ready for review. All automated checks have passed, but merging is blocked because: ✅ At least 1 approving review is required Could you please:
Thanks for your time! 🙏 |
There was a problem hiding this comment.
Pull Request Overview
This PR fixes compatibility issues with newer versions of Newlib (>= 3.4.0) by updating the stdio initialization code. The __sdidinit field was removed from the _GLOBAL_REENT structure in newer Newlib versions, causing compilation errors when accessing this field directly.
Key changes:
- Replaces version-specific macro checks with feature detection
- Uses
_REENT_SMALLand__sdidinitdefinitions to determine compatibility - Maintains backward compatibility with older Newlib versions
| // Newlib >= 3.4.0 or small reent version: no __sdidinit field | ||
| // Do nothing | ||
| #else | ||
| // Older newlib versions (typically < 3.4.0) still define __sdidinit |
There was a problem hiding this comment.
English: The comment style should follow RT-Thread coding standards using C-style comments (/* */) instead of C++-style comments (//) for consistency with the existing codebase.\n\n中文: 注释风格应遵循 RT-Thread 编码标准,使用 C 风格注释(/* */)而不是 C++ 风格注释(//),以与现有代码库保持一致。
| // Newlib >= 3.4.0 or small reent version: no __sdidinit field | |
| // Do nothing | |
| #else | |
| // Older newlib versions (typically < 3.4.0) still define __sdidinit | |
| /* Newlib >= 3.4.0 or small reent version: no __sdidinit field */ | |
| /* Do nothing */ | |
| #else | |
| /* Older newlib versions (typically < 3.4.0) still define __sdidinit */ |
|
@Rbb666 @supperthomas |
|
这边看到代码,没有修改,再check一下。 |
|
这个是因为多加了一个空格,所以审核没通过,所以我把空格去掉了。
|
|
@Rbb666 @supperthomas |
f50b8d8 to
bf93762
Compare
|
@Rbb666 @supperthomas |
|
pull request 标题修改一下,添加前缀,参考其他PR |
|
收到
|
|
已修改完成,谢谢您提意见。
|
|
感谢贡献 |
|
谢谢各位给予修改意见让我完成本次合并。谢谢! |

拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
前 RT-Thread 在使用 newlib 的部分版本时,会出现以下问题:
在
_GLOBAL_REENT结构中,旧版本使用的__sdidinit字段已被移除;_GLOBAL_REENT->__sdidinit,导致在编译 newlib 时出错;你的解决方案是什么 (what is your solution)
在
components/libc/posix/io/stdio.c/stdio.c中增加更合理的版本判断宏:#if defined(_REENT_SMALL) || !defined(__sdidinit)
// Newlib >= 3.4.0 or small reent version: no __sdidinit field
// Do nothing
#else
// Older newlib versions (typically < 3.4.0) still define __sdidinit
_GLOBAL_REENT->__sdidinit = 1;
#endif
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up