GCC __attribute __((模式(XX))实际上做了什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC __attribute __((模式(XX))实际上做了什么?相关的知识,希望对你有一定的参考价值。

这源于今天早些时候关于bignum库和gcc特定的C语言攻击主题的问题。具体来说,使用了这两个声明:

typedef unsigned int dword_t __attribute__((mode(DI)));

在32位系统和

typedef unsigned int dword_t __attribute__((mode(TI)));

在64位系统上。

我假设这是对C语言的扩展,没有办法实现它在当前(C99)标准中实现的任何目标。

所以我的问题很简单:这个假设是否正确?这些陈述对底层内存有何影响?我认为结果是我在32位系统中使用2*sizeof(uint32_t)而在64位系统中使用dword,我是否正确?

答案

这些允许您显式指定类型的大小,而不依赖于编译器或机器语义,例如“long”或“int”的大小。

他们被描述得相当好2*sizeof(uint64_t)

我从那个页面引用:

QI:与最小可寻址单元一样宽的整数,通常为8位。

HI:一个整数,是QI模式整数的两倍,通常是16位。

SI:整数,是QI模式整数的四倍,通常是32位。

DI:整数,是QI模式整数的八倍,通常为64位。

SF:浮点值,与SI模式整数一样宽,通常为32位。

DF:浮点值,与DI模式整数一样宽,通常为64位。

所以on this page基本上是DI

进一步的解释,包括sizeof(char) * 8模式,可以找到TI(可能比第一个链接更好,但两者都提供参考)。

所以here本质上是TI(128位)。

另一答案

@haelix刚看完这个问题,我也试着理解这个问题。通过阅读:您可以在GCC源代码树的[gcc / gcc / machmode.def]中找到定义。对于'SD',它应该是:

sizeof(char) * 16

和'DECIMAL_FLOAT_MODE'说:

    /* Decimal floating point modes.  */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);

以上是关于GCC __attribute __((模式(XX))实际上做了什么?的主要内容,如果未能解决你的问题,请参考以下文章

__attribute__((packed))作用

gcc之__attribute__简介及对齐参数介绍

C 语言编程 — GCC Attribute 语法扩展

C 语言编程 — GCC Attribute 语法扩展

等效于 Visual C++ 中 gcc 的 __attribute__ 格式

GCC __attribute__((constructor)) 在对象构造函数之前调用