分段堆栈可以与其他库一起自由使用吗

Can segmented stacks be used freely with other libraries

本文关键字:自由 一起 其他 堆栈 分段      更新时间:2023-10-16

根据我的理解,分段堆栈是在编译器支持下构建的,因此每当在分段堆栈上运行的函数调用另一个函数时,if首先检查堆栈是否有足够的空间用于该新函数的堆栈帧。如果没有,则附加另一个分段堆栈,并将代码分支到该函数。

但是,例如,如果我有一个光纤正在运行,并且我从另一个未使用-fsplit-stack选项编译的共享(或编译到非共享对象文件)库中调用另一个函数,这是否有效?该库中的函数如何知道他们必须检查分段堆栈在分段堆栈中是否有足够的空间继续?

只对clang和gcc实现感兴趣(尤其是对boost上下文),谢谢!

我要回顾一下我记得在之前关于这个主题的问题中看到的一段文档:

向后兼容性

我们希望能够在具有预构建库的系统上使用拆分堆栈程序,这些库是在没有拆分堆栈的情况下编译的。这意味着,在调用任何此类函数之前,我们需要确保有足够的堆栈空间。

以拆分堆栈模式编译的每个对象文件都将被注释,以指示函数使用拆分堆栈。这可能应该用注释来注释,但在GNUas中没有通用的创建任意注释的支持。因此,在拆分堆栈模式下编译的每个对象文件都将有一个具有特殊名称的空部分:。note.GNU-split-stack。如果以拆分堆栈模式编译的对象文件包含一些具有no_split_stack属性的函数,那么该对象文件也将具有.note.GNU-no-split-stack section。这将告诉链接器,某些函数可能没有预期的拆分堆栈序言。

[…]

对于从拆分堆栈代码到非拆分堆栈代码的调用,链接器将更改拆分堆栈(调用方)函数中的初始指令这意味着链接器必须对编译器发出的指令有专门的知识。更改的效果是将所需的帧大小增加一个足够大的数字,以便合理地用于非拆分堆栈这将是一个与目标相关的数字;默认值大约是64K请注意,当split stack函数返回时,这个大堆栈将被释放注意,我忽略了共享库中的拆分堆栈代码在主可执行文件中调用非拆分堆栈代码的情况;这似乎是个不大可能的问题

我特别记得列表(斜体)警告-我不记得是我或其他人突出显示了它。那次讨论中的关键词是关于";回调";。