【问题标题】:Equivalent of __declspec( naked ) in gcc/g++gcc/g++ 中的 __declspec(naked) 等价物
【发布时间】:2011-12-17 18:17:21
【问题描述】:

gcc/g++__declspec( naked ) 的等价物是什么? __declspec( naked )实际上是用来声明一个没有任何结语和序言的函数。

【问题讨论】:

标签: c++ c linux gcc g++


【解决方案1】:

在某些架构上,gcc 支持一个名为“naked”的属性;最近的gcc docs 我已经给出了这个架构列表:ARM、AVR、MCORE、RX 和 SPU。

如果您正在使用其中一种架构(如果您尝试使用它并且它不受支持,gcc 会给您一个警告),该属性可以这样使用:

__attribute__ ((naked)) int fun ()
{
}

[最近在 gcc 开发人员列表上进行了一些讨论,关于添加“naked”属性作为更通用的功能,并尝试在更多架构上支持它,但显然这对您没有帮助:)。]

【讨论】:

【解决方案2】:

我相信 Linux 下的最新 GCC 没有这样的等价物。编译器会在适当的时候发出序言和尾声,你应该把这个决定留给它。它可能非常擅长将序言或尾声制作得非常小,甚至有时根本不存在。

您可以在汇编中编写您的函数。或者您可以将 asm 语句放入您的函数中。

而且你没有说明你为什么要这样做。你的目标是什么,你为什么要问这个问题?

【讨论】:

  • 你错了,我自己曾经用过这种东西,现在想不起来了。
  • 你是用 GCC 做的吗? SigTerm 引用的页面与我所说的一致:如果您不想使用 GCC 和 Linux(在 x86 或 AMD64 目标机器上),请使用 asm。
  • 嗯,实际上有,但仅适用于某些(嵌入式)架构,正如您在评论中暗示的那样。
  • 在嵌入式系统的情况下,能够执行裸函数很重要,因为堆栈位于 RAM 中,避免将代码执行保留在 ROM 中是有用的(只要 RAM 不是初始化示例)。
  • 这个答案是错误的,正如 snogglethorpe 在另一个答案中所说,裸属性摆脱了所有序言和尾声,但根据架构,它仍然会执行链接分支而不放置旧内容堆栈上的链接寄存器。例如,在撰写本文时,GCC 将执行 bl,然后您必须在您的裸函数中执行 bx lr 才能返回。
猜你喜欢
  • 2011-01-08
  • 2022-10-04
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
相关资源
最近更新 更多