分段堆栈可以与其他库一起自由使用吗
Can segmented stacks be used freely with other libraries
根据我的理解,分段堆栈是在编译器支持下构建的,因此每当在分段堆栈上运行的函数调用另一个函数时,if首先检查堆栈是否有足够的空间用于该新函数的堆栈帧。如果没有,则附加另一个分段堆栈,并将代码分支到该函数。
但是,例如,如果我有一个光纤正在运行,并且我从另一个未使用-fsplit-stack
选项编译的共享(或编译到非共享对象文件)库中调用另一个函数,这是否有效?该库中的函数如何知道他们必须检查分段堆栈在分段堆栈中是否有足够的空间继续?
只对clang和gcc实现感兴趣(尤其是对boost上下文),谢谢!
我要回顾一下我记得在之前关于这个主题的问题中看到的一段文档:
向后兼容性
我们希望能够在具有预构建库的系统上使用拆分堆栈程序,这些库是在没有拆分堆栈的情况下编译的。这意味着,在调用任何此类函数之前,我们需要确保有足够的堆栈空间。
以拆分堆栈模式编译的每个对象文件都将被注释,以指示函数使用拆分堆栈。这可能应该用注释来注释,但在GNU
as
中没有通用的创建任意注释的支持。因此,在拆分堆栈模式下编译的每个对象文件都将有一个具有特殊名称的空部分:。note.GNU-split-stack
。如果以拆分堆栈模式编译的对象文件包含一些具有no_split_stack
属性的函数,那么该对象文件也将具有.note.GNU-no-split-stack section
。这将告诉链接器,某些函数可能没有预期的拆分堆栈序言。
[…]
对于从拆分堆栈代码到非拆分堆栈代码的调用,链接器将更改拆分堆栈(调用方)函数中的初始指令这意味着链接器必须对编译器发出的指令有专门的知识。更改的效果是将所需的帧大小增加一个足够大的数字,以便合理地用于非拆分堆栈这将是一个与目标相关的数字;默认值大约是64K请注意,当split stack函数返回时,这个大堆栈将被释放注意,我忽略了共享库中的拆分堆栈代码在主可执行文件中调用非拆分堆栈代码的情况;这似乎是个不大可能的问题
我特别记得列表(斜体)警告-我不记得是我或其他人突出显示了它。那次讨论中的关键词是关于";回调";。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将自由函数绑定为类成员函数
- 将 std::allocate_shared 与多态资源分配器一起使用
- 静态数组的自由动态数组
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 分段堆栈可以与其他库一起自由使用吗
- 如何将自由函数与对象一起使用