我理解它的方式,分段堆栈是使用编译器支持构建的,这样每当在分段堆栈上运行的函数调用另一个函数时,如果首先检查堆栈是否有足够的空间用于该新函数的堆栈帧。如果它没有附加另一个分段堆栈并且代码分支到该函数。
但是,如果我说光纤正在运行,并且我从另一个未使用$sql = "SELECT name FROM student_info WHERE code='$code'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$name = $row["name"];
}
选项编译的共享(或编译到非共享目标文件)库中调用另一个函数,这是否有效?该库中的函数如何知道他们必须检查分段堆栈中是否有足够的空间来继续?
只对clang和gcc实现感兴趣(特别是对于boost上下文),谢谢!
答案 0 :(得分:1)
我要回过头来看一篇关于这个主题的早期问题的文档:
向后兼容性
我们希望能够在没有拆分堆栈的情况下编译预编译库的系统上使用拆分堆栈程序。这意味着我们需要在调用任何此类函数之前确保有足够的堆栈空间。
将以拆分堆栈模式编译的每个目标文件进行注释,以指示这些函数使用拆分堆栈。这应该用注释注释,但是在GNU
as
中创建任意注释没有一般支持。因此,以拆分堆栈模式编译的每个目标文件都将具有一个带有特殊名称的空部分:。note.GNU-split-stack
。如果以拆分堆栈模式编译的目标文件包含具有no_split_stack
属性的某些函数,则目标文件也将具有.note.GNU-no-split-stack section
。这将告诉链接器某些函数可能没有预期的拆分堆栈序言。
[...]
对于从分组堆栈代码到非分割堆栈代码的调用,链接器将更改分组堆栈(调用方)函数中的初始指令。这意味着链接器必须具有编译器发出的指令的特殊知识。更改的效果是将所需的帧大小增加一个足够大的数字,以便合理地用于非拆分堆栈。 这将是目标相关数字;默认值将类似于64K。请注意,当拆分堆栈函数返回时,将释放此大堆栈。 请注意,我忽略了在主可执行文件中调用非拆分堆栈代码的共享库中的拆分堆栈代码的情况;这似乎是一个不太可能的问题。
我特别记得列表(斜体)警告 - 我不记得是我突出显示它或其他人。该讨论中的关键字是关于“回调”。