Uecker

Uecker.codeberg.page 的网站。

GCC 嵌套函数实现原理:与 C++ Lambda 的对比分析

Martin Uecker 详解 GCC 嵌套函数的底层实现机制,并与 C++ Lambda 对比。GCC 在中间阶段将父函数变量收集到合成结构体,通过隐藏指针传递给嵌套函数;C++ Lambda 则为每个表达式生成独立的 callable 对象。 两者语义相同但实现路径不同,文章附带 Godbolt 汇编示例。
评论点赞收藏25 天前

在非可执行栈上间接调用 GCC 嵌套函数

通过从 GCC trampoline 提取代码地址和静态链,可在非可执行栈上间接调用嵌套函数。GCC 为嵌套函数在栈上生成 trampoline 代码序列,包含静态链指针和目标代码地址;用 peek 宏读取这两个值后,通过 __builtin_call_with_static_chain 直接调用,跳过 trampoline 执行。 之后用 patchelf --clear-execstack 清除栈的可执行标志。该方法已实现在实验性库 noplate 中,适用于 GCC 17 之前的版本。
评论点赞收藏32 天前

GCC 嵌套函数新方案:用宽指针替代 Trampoline,无需可执行栈

Martin Uecker 的 GCC 补丁已合并入开发分支,用宽指针类型替代 trampoline,让嵌套函数无需可执行栈即可捕获父函数变量。GCC 16 已保证无捕获的嵌套函数不需要 trampoline;GCC 17 新增两个 builtin 函数支持有捕获场景。 代码经编译器优化后可生成单条 lea 指令。
评论点赞收藏46 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。