【问题标题】:gcc -fPIC seems to muck with optimization flagsgcc -fPIC 似乎带有优化标志
【发布时间】:2009-11-17 08:00:18
【问题描述】:

从这个问题开始:how-do-i-check-if-gcc-is-performing-tail-recursion-optimization,我注意到使用带有 -fPIC 的 gcc 似乎破坏了这种优化。我正在创建一个共享库,但我似乎不需要 -fPIC 选项。

好吧,我的问题是,为什么 -fPIC 会改变 gcc 优化?出于任何原因我需要保留 -fPIC 吗?

【问题讨论】:

  • 您能否提供重现您所描述行为的方法?听起来不太对劲。但是,gcc 实现中的一些内部约束可能会强制禁用 PIC 模式下的优化...
  • GCC 的哪个版本?哪个平台? “-fPIC”有时会将生成的代码更改为“位置无关代码”(因此是 PIC),这意味着它可能不同于“位置相关代码”。您使用什么选项?
  • 啊,在我们的 64 位服务器上,gcc 说需要 -fPIC。

标签: c optimization gcc tail-call-optimization


【解决方案1】:

在没有目标架构和编译器版本等细节的情况下,可能的解释是这样的:

在位置相关代码中,尾递归优化本质上是重用当前堆栈帧,并将考虑的call 替换为jump。语法可能是call function 替换为jmp <small offset of function>

在与位置无关的代码中,如果指令集允许,调用可以写成call function@PLT(这个例子是amd64)。它完全可以用jmp <small offset of function>@PLT 代替,但是这两个设置确实会干扰,也许 gcc 开发人员没有考虑在后一种模式下实现尾调用优化。

【讨论】:

    【解决方案2】:

    在 ia32 linux 中,使用 fpic 意味着您没有可用于通用用途的 ebx,这肯定会影响优化。可能是由于寄存器调度压力,编译器决定反对尾递归优化。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 2023-03-30
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多