You should carefully check structures that use 64-bit long types, such as uint64_t, on the x86 platforms. The alignment and size can differ between compilation in 32-bit mode versus a 64-bit mode. Consider the following example.
#include <studio> #include <sys> struct myTestStructure { uint32_t my1stInteger; uint64_t my2ndInteger; }; main() { struct myTestStructure a; printf("sizeof myTestStructure is: %d\n", sizeof(a)); printf("offset to my2ndInteger is: %d\n", (uintptr_t)&a.bar - (uintptr_t)&a); }
On a 32-bit system, this example displays the following results:
sizeof myTestStructure is: 12 offset to my2ndInteger is: 4 |
Conversely, on a 64-bit system, this example displays the following results:
sizeof myTestStructure is: 16 offset to my2ndInteger is: 8 |
Thus, the 32-bit application and the 64-bit application view the structure differently. As a result, trying to make the same structure work in both a 32-bit and 64-bit environment can cause problems. This situation occurs often, particularly in situations where structures are passed into and out of the kernel through ioctl() calls.