To what extent does the Itanium ABI really specify padding and alignment?

坚强是说给别人听的谎言 提交于 2019-11-30 23:37:23

问题


I've been told:

[ABIs] guarantee the exact layout of the struct, byte offset of every member, which bits are used for bit fields, where and how much padding there is, etc...

But I've always believed that padding and alignment were unspecified and unreliable.

Does the Itanium ABI (which GCC uses) in fact specify these things (as far as I can tell, it doesn't appear to beyond specifying ranges)?

And if it does, how do options like __attribute__ ((packed)) fit into that? Do they ultimately break the ABI by altering the alignment of things?

Or, as the quotee implies, is packing merely unspecified between toolchains but in fact reliable and predictable within the use of a certain ABI? And then, again, how does something like __attribute__ ((packed)) fit into that?


回答1:


padding and alignment are unspecified by the ISO standard C++ specification and hence unreliable.

The use of the word "exact" in the quote is exaggeration. The Itanium ABI (which GCC uses) may specify these things (as within specifying ranges) as needed rather than always and exact ly.

Packing is in fact reliable and predictable within the use of toolchains assuming predetermined target architecture & environment- viz. ABI. When all target specific details applicable to the tool-chain are predetermined __attribute__ ((packed)) like any other construct will generate output predictably for the tool-chain to work correctly.




回答2:


You need to follow the documentation to the standards incorporated by reference.

Most types' size and alignment is specified in the Intel System V ABI specifications; for example, long long and long double types' size and alignment are documented in the Unix System V Application Binary Interface, Itanium Processor Supplement (no. 245370-001), table 3-1 Additional Fundamental Data Types.

It's a little difficult to find authoritative copies of standards, especially as there isn't a real standards process. A good reference that includes the sizes and alignments of all types in the LP64 ABI is http://www.x86-64.org/documentation/abi.pdf although it doesn't cover the ILP32 ABI.

__attribute__((packed)) is of course gcc-specific, as is #pragma pack for MSVC. You may be able to use compiler compatibility features to get consistent layout of structs across compilers, but assuming that behavior is the same just because a compatibility feature is implemented is not a good idea; you should test that sizes and key offsets are the same.



来源:https://stackoverflow.com/questions/13582153/to-what-extent-does-the-itanium-abi-really-specify-padding-and-alignment

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!