Perhaps I do not understand the proper usage, but I am wondering if the __attrrbute__((aligned(x))) is broken with regards to structures.
Given the following (and also with the attribute explicitly declared [both before and after the variable, and also for the whole structure] instead of a macro) I do not see the alignment I expect.
Regardless of the way I try to do it, I get addresses for the variable members similar to:
d41370e4:d41370e8:d41370ec:d41370f0 for the 4 member variables respectively. While InputBufferLength and Type3InputBuffer are 8 byte aligned, that seems to be just because we are dealing the first three 4 byte members and it starts on a 4 byte alignment.
Also of note is that the size is 20 bytes, and I would expect 28 if the last three members were 8 byte aligned.
I also did a test with two stack variables declared using no alignment attribute, and got 4 byte alignment. Then used the aligned attribute and got 8 byte alignment as I would expect.
Any insights would be appreciated.
Thanks.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Perhaps I do not understand the proper usage, but I am wondering if the __attrrbute__((aligned(x))) is broken with regards to structures.
Given the following (and also with the attribute explicitly declared [both before and after the variable, and also for the whole structure] instead of a macro) I do not see the alignment I expect.
#define DECLSPEC_ALIGN(x) __attribute__((aligned(x)))
#if defined(_WIN64)
#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
#else
#define POINTER_ALIGNMENT
#endif
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID Type3InputBuffer;
} DeviceIoControl;
Regardless of the way I try to do it, I get addresses for the variable members similar to:
d41370e4:d41370e8:d41370ec:d41370f0 for the 4 member variables respectively. While InputBufferLength and Type3InputBuffer are 8 byte aligned, that seems to be just because we are dealing the first three 4 byte members and it starts on a 4 byte alignment.
Also of note is that the size is 20 bytes, and I would expect 28 if the last three members were 8 byte aligned.
I also did a test with two stack variables declared using no alignment attribute, and got 4 byte alignment. Then used the aligned attribute and got 8 byte alignment as I would expect.
Any insights would be appreciated.
Thanks.