Control: tags -1 +patch The attached patch fixes the problem. It was indeed an alignment issue which was caused by the incorrect use of "#pragma pack ()" throughout the code as discovered by James Clarke [1].
The problem is that changing the default alignment using "#pragma pack (n)" to n bytes does not only apply to the struct following the #pragma directive but the all of the remaining code followed by the statement which results in all kinds of structs to become unaligned. According to the gcc documentation, "#pragma pack ()" switches the alignment back to the previous value which would be the native alignment for a given architecture. I have just done this and gdisk now builds fine for me on sparc64 and passes the testsuite. I am also about to send a pull request upstream. Thanks, Adrian > [1] > https://sourceforge.net/p/gptfdisk/discussion/939590/thread/eaf714bb/?limit=25#92b4 > [2] > https://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Structure_002dPacking-Pragmas.html -- .''`. John Paul Adrian Glaubitz : :' : Debian Developer - glaub...@debian.org `. `' Freie Universitaet Berlin - glaub...@physik.fu-berlin.de `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
>From c9dc1134413e8fa50f63354b78e84179b273896d Mon Sep 17 00:00:00 2001 From: John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de> Date: Fri, 18 May 2018 23:30:05 +0200 Subject: [PATCH] Reset struct alignment back to standard after each #pragma pack (n) When using #pragma pack (n) to change the alignment for a struct to n bytes, it is necessary to reset the alignment to the standard value as otherwise the changed alignment is used throughout the whole program code which causes other structs to become unaligned. --- basicmbr.h | 1 + bsd.h | 1 + gpt.h | 1 + mbrpart.h | 1 + 4 files changed, 4 insertions(+) diff --git a/basicmbr.h b/basicmbr.h index b809856..21f962e 100644 --- a/basicmbr.h +++ b/basicmbr.h @@ -34,6 +34,7 @@ struct TempMBR { struct MBRRecord partitions[4]; uint16_t MBRSignature; }; // struct TempMBR +#pragma pack () // Possible states of the MBR enum MBRValidity {invalid, gpt, hybrid, mbr}; diff --git a/bsd.h b/bsd.h index ffbe5cc..cbd3588 100644 --- a/bsd.h +++ b/bsd.h @@ -89,5 +89,6 @@ class BSDData { int GetNumParts(void); GPTPart AsGPT(int i); // Return BSD part. as GPT part. }; // struct MBRData +#pragma pack () #endif diff --git a/gpt.h b/gpt.h index 2d7a1ce..f4bf470 100644 --- a/gpt.h +++ b/gpt.h @@ -57,6 +57,7 @@ struct GPTHeader { uint32_t partitionEntriesCRC; unsigned char reserved2[GPT_RESERVED]; }; // struct GPTHeader +#pragma pack () // Data in GPT format class GPTData { diff --git a/mbrpart.h b/mbrpart.h index f5892e7..0de365f 100644 --- a/mbrpart.h +++ b/mbrpart.h @@ -50,6 +50,7 @@ struct MBRRecord { uint32_t firstLBA; // see above uint32_t lengthLBA; }; // struct MBRRecord +#pragma pack () class MBRPart { protected: -- 2.17.0