【问题标题】:How to tell if a translation unit is being compiled with segmented stacks如何判断翻译单元是否正在使用分段堆栈进行编译
【发布时间】:2018-07-23 21:07:21
【问题描述】:

C++ 中是否有预处理器宏、常量或类似的东西可用于判断翻译单元是否使用分段堆栈(即使用-fsplit-stack)进行编译?

任何编译器的答案都很好,但我特别在寻找 clang 和 gcc

【问题讨论】:

  • objdump -h ./myobjfile.o | grep split-stack
  • @HadiBrais 我需要一种以编程方式确定这一点的方法,以便可以在 c++ 中使用它来有条件地编译部分代码。所以我认为这种方法行不通,除非你知道这里有一些神奇的内省技术:)
  • 您的问题是您想知道如何判断翻译单元是否已编译。您应该将其更改为正在编译
  • @HadiBrais 完成,编辑问题

标签: c++ portability


【解决方案1】:

根据this gcc wiki page,预处理器得到TARGET_SUPPORTS_SPLIT_STACK,运行时得到bool supports_split_stack()

【讨论】:

  • 谢谢!这不是说支持拆分堆栈的编译器必须定义该函数吗?不是说如果支持分段堆栈,该函数将被定义并返回 true?
  • @Curious 我不确定,抱歉。
  • 此类标志有通用约定吗?例如,有人可以判断一个程序是否已使用-fno-rtti 编译?
  • @Curious Right。 TARGET_SUPPORTS_SPLIT_STACK 只告诉目标架构是否支持拆分堆栈。它不会告诉您翻译单元是否正在使用-fsplit-stack 进行编译。我认为没有宏。
  • 对于 RTTI,一些编译器支持适用于翻译单元的some magic
【解决方案2】:

在撰写本文时,从GitHub mirror 的主分支检查 gcc 源代码表明,除了在代码生成和链接级别可能为时已晚,flag_split_stack 没有任何可见的副作用。我没有像 gcc 那样深入地研究 clang 代码,但可能情况应该类似。

如果您也可以允许运行时检查,您也许可以为它们中的每一个编写特定于平台的检测(例如,__morestack() call 通过检查代码进行检测;请参阅morestack.S),但它应该有点在与 objdump 使用类似的情况下,它不能用于编译时诊断。

最好的方法可能是向编译器供应商请求功能,或者如果您可以控制构建系统,则使用 -D-fsplit-stack 添加自定义宏。

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 2023-03-03
    • 1970-01-01
    • 2017-02-08
    • 2011-01-01
    • 2021-12-09
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多