X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Recipient: djgpp AT delorie DOT com X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=+ZsywSv7UZvB/SL3MAgdhLpwGc2ruQ/G4m98LCZ7IgY=; b=aXAdp8uFBBqSY3rehwG4QK0ImfoHsM2saBu8UpO1WgdU9MqA0ji/tasjALcZZCKlDl NMv0y3QfB9ZWTqXI77FZHx8try5/ledk5n6fHskyS5dJl70/jfjvJrAroldC70cq0Wzr QmgteHc7KH1JsuObfZCFbzuBaElzoX/sunRZ7nYHE8A/AkIfkaZSJ5AvukPZcK950P4p iS/qJ/hF4anXh7VA19yHL4KkxqTrpbwCFpLwl7M40s01CKgydBLTOIP+j05mVfSmEgOk 2o+kCpKssjQk9horJyZyZkERjvbUJShuOKN4bRyqjx94FeDllr49xm0fG/aki1Ue37SD JBtw== MIME-Version: 1.0 X-Received: by 10.107.138.130 with SMTP id c2mr6429782ioj.74.1431621286669; Thu, 14 May 2015 09:34:46 -0700 (PDT) In-Reply-To: <83vbfvi3t1.fsf@gnu.org> References: <83k2wcjt8e DOT fsf AT gnu DOT org> <83bnhojnwh DOT fsf AT gnu DOT org> <838ucsjnbl DOT fsf AT gnu DOT org> <83vbfvi3t1 DOT fsf AT gnu DOT org> Date: Thu, 14 May 2015 19:34:46 +0300 Message-ID: Subject: Re: bad pragma in dir.h? (and our structrure packing) From: "Ozkan Sezer (sezeroz AT gmail DOT com)" To: djgpp AT delorie DOT com Content-Type: multipart/mixed; boundary=001a113f284e3eb22105160d4e5d Reply-To: djgpp AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk --001a113f284e3eb22105160d4e5d Content-Type: text/plain; charset=UTF-8 On 5/14/15, Eli Zaretskii (eliz AT gnu DOT org) wrote: >> Date: Wed, 13 May 2015 23:27:39 +0300 >> From: "Ozkan Sezer (sezeroz AT gmail DOT com)" >> >> > If you (or someone else) can verify that the size of the structure and >> > the offsets of each member are the same in both C and C++ programs, >> > then I see no reason to keep the attribute on every member. >> >> I did the following as a foo.c and foo.cc: >> >> #define COMPILE_TIME_ASSERT(name, x) \ >> typedef int _djchk_ ## name[(x) * 2 - 1] >> >> #include "dos.h" >> COMPILE_TIME_ASSERT(find_t,sizeof(struct _find_t)==286); >> >> #include "dir.h" >> COMPILE_TIME_ASSERT(ffblk,sizeof(struct ffblk)==290); >> COMPILE_TIME_ASSERT(ffblklfn,sizeof(struct ffblklfn)==318); >> >> #include "coff.h" >> COMPILE_TIME_ASSERT(exln,sizeof(struct external_lineno)==6); >> COMPILE_TIME_ASSERT(exse,sizeof(struct external_syment)==18); >> COMPILE_TIME_ASSERT(exau,sizeof(union external_auxent)==18); >> COMPILE_TIME_ASSERT(exrl,sizeof(struct external_reloc)==10); >> >> Compiled using existing and modified headers for djgpp using gcc/g++ >> v3.4.6 and 5.1.0, no errors. I also compiled its coff.h-only parts >> for linux (i686 gcc-4.3.0 and clang-3.4.2), osx (ppc gcc-4.0.1 and >> x86_64 gcc-4.2.1), mingw (gcc-3.4.5), mingw-w64 (x86_64 gcc-4.5.4): >> no errors. >> >> Diff for the modified headers is attached (1.patch) >> Ideas? > > LGTM, thanks. > OK, fixed the broken pragma in dir.h as of r1.7. Moved the packed attributes from members to structures as of dir.h r1.8, dos.h r1.16 and coff.h r1.8. >> On 5/13/15, Andris Pavenis (andris DOT pavenis AT iki DOT fi) >> wrote: >> > I guess it would be a good idea to have small test in build process to >> > verify that offsets of >> > members are correct for structures intended for DOS calls. So build >> > would >> > fail if something is >> > wrong with member packing >> > >> > Andris >> >> We can add compile-time asserts like the above to the headers: ideas? > > I think a test in djtst would be better. > > Thanks. > I would feel safer if the compile time asserts reside in the relevant headers and checked every time something is compiled against them. How about the following patch: (also attached as 3a.patch) coff.h, dos.h, dir.h: conditionalize packed pragma to gcc < 3. add compile time assertions to make sure of correct structure packing. Index: include/coff.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/coff.h,v retrieving revision 1.8 diff -u -r1.8 coff.h --- include/coff.h 14 May 2015 16:23:05 -0000 1.8 +++ include/coff.h 14 May 2015 16:32:23 -0000 @@ -150,6 +150,9 @@ * grouping will have l_lnno = 0 and in place of physical address will be the * symbol table index of the function name. */ +#if (__GNUC__ < 3) +#pragma pack(1) +#endif struct external_lineno { union { ULONG32 l_symndx; /* function name symbol index, iff l_lnno == 0 */ @@ -157,10 +160,14 @@ } l_addr; unsigned short l_lnno; /* line number */ } __attribute__((packed)); - +#if (__GNUC__ < 3) +#pragma pack() +#endif #define LINENO struct external_lineno #define LINESZ sizeof(LINENO) +/* make sure that structure packing is correct */ +typedef int _DJCHK_EXTLINENO[(LINESZ==6)*3 - 1]; /********************** SYMBOLS **********************/ @@ -169,6 +176,9 @@ #define E_FILNMLEN 14 /* # characters in a file name */ #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ +#if (__GNUC__ < 3) +#pragma pack(1) +#endif struct external_syment { union { @@ -184,12 +194,18 @@ unsigned char e_sclass; unsigned char e_numaux; } __attribute__((packed)); +#if (__GNUC__ < 3) +#pragma pack() +#endif #define N_BTMASK (0xf) #define N_TMASK (0x30) #define N_BTSHFT (4) #define N_TSHIFT (2) +#if (__GNUC__ < 3) +#pragma pack(1) +#endif union external_auxent { struct { ULONG32 x_tagndx; /* str, un, or enum tag indx */ @@ -233,11 +249,17 @@ } __attribute__((packed)) x_tv; /* info about .tv section (in auxent of symbol .tv)) */ } __attribute__((packed)); +#if (__GNUC__ < 3) +#pragma pack() +#endif #define SYMENT struct external_syment #define SYMESZ sizeof(SYMENT) #define AUXENT union external_auxent #define AUXESZ sizeof(AUXENT) +/* make sure that structure packing is correct */ +typedef int _DJCHK_EXTSYMENT[(SYMESZ==18)*3 - 1]; +typedef int _DJCHK_EXTAUXENT[(AUXESZ==18)*3 - 1]; #define _ETEXT "etext" @@ -325,16 +347,22 @@ /********************** RELOCATION DIRECTIVES **********************/ - +#if (__GNUC__ < 3) +#pragma pack(1) +#endif struct external_reloc { ULONG32 r_vaddr; ULONG32 r_symndx; unsigned short r_type; } __attribute__((packed)); - +#if (__GNUC__ < 3) +#pragma pack() +#endif #define RELOC struct external_reloc #define RELSZ sizeof(RELOC) +/* make sure that structure packing is correct */ +typedef int _DJCHK_EXTRELOC[(RELSZ==10)*3 - 1]; #define RELOC_REL32 20 /* 32-bit PC-relative address */ #define RELOC_ADDR32 6 /* 32-bit absolute address */ Index: include/dir.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/dir.h,v retrieving revision 1.8 diff -u -r1.8 dir.h --- include/dir.h 14 May 2015 16:23:05 -0000 1.8 +++ include/dir.h 14 May 2015 16:32:23 -0000 @@ -24,8 +24,9 @@ hold the extra information. Fields marked LFN are only valid if the magic is set to LFN32 */ -/* This is for g++ 2.7.2 and below */ +#if (__GNUC__ < 3) /* This is for g++ 2.7.2 and below */ #pragma pack(1) +#endif struct ffblk { char lfn_magic[6]; /* LFN */ @@ -54,7 +55,12 @@ char fd_name[14]; } __attribute__((packed)); +#if (__GNUC__ < 3) #pragma pack() +#endif +/* make sure that structure packing is correct */ +typedef int _DJCHK_FFBLK0[(sizeof(struct ffblk) ==290)*3 - 1]; +typedef int _DJCHK_FFBLK1[(sizeof(struct ffblklfn)==318)*3 - 1]; #define FA_RDONLY 1 #define FA_HIDDEN 2 Index: include/dos.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/dos.h,v retrieving revision 1.16 diff -u -r1.16 dos.h --- include/dos.h 14 May 2015 16:23:05 -0000 1.16 +++ include/dos.h 14 May 2015 16:32:23 -0000 @@ -214,6 +214,9 @@ }; #define dostime_t _dostime_t +#if (__GNUC__ < 3) +#pragma pack(1) +#endif struct _find_t { char reserved[21]; unsigned char attrib; @@ -222,7 +225,12 @@ unsigned long size; char name[256]; } __attribute__((packed)); +#if (__GNUC__ < 3) +#pragma pack() +#endif #define find_t _find_t +/* make sure that structure packing is correct */ +typedef int _DJCHK_FIND_T[(sizeof(struct _find_t)==286)*3 - 1]; struct _diskfree_t { unsigned short total_clusters; -- O.S. --001a113f284e3eb22105160d4e5d Content-Type: application/octet-stream; name="3a.patch" Content-Disposition: attachment; filename="3a.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: file0 Y29mZi5oLCBkb3MuaCwgZGlyLmg6IGNvbmRpdGlvbmFsaXplIHBhY2tlZCBwcmFnbWEgdG8gZ2Nj IDwgMy4KYWRkIGNvbXBpbGUgdGltZSBhc3NlcnRpb25zIHRvIG1ha2Ugc3VyZSBvZiBjb3JyZWN0 IHN0cnVjdHVyZSBwYWNraW5nLgoKSW5kZXg6IGluY2x1ZGUvY29mZi5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNT IGZpbGU6IC9jdnMvZGpncHAvZGpncHAvaW5jbHVkZS9jb2ZmLmgsdgpyZXRyaWV2aW5nIHJldmlz aW9uIDEuOApkaWZmIC11IC1yMS44IGNvZmYuaAotLS0gaW5jbHVkZS9jb2ZmLmgJMTQgTWF5IDIw MTUgMTY6MjM6MDUgLTAwMDAJMS44CisrKyBpbmNsdWRlL2NvZmYuaAkxNCBNYXkgMjAxNSAxNjoz MjoyMyAtMDAwMApAQCAtMTUwLDYgKzE1MCw5IEBACiAgKiBncm91cGluZyB3aWxsIGhhdmUgbF9s bm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQogICog c3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgogICovCisjaWYgKF9fR05V Q19fIDwgMykKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCiBzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5v IHsKICAgdW5pb24gewogICAgIFVMT05HMzIgbF9zeW1uZHg7CQkJCS8qIGZ1bmN0aW9uIG5hbWUg c3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KQEAgLTE1NywxMCArMTYwLDE0IEBACiAg IH0gbF9hZGRyOwogICB1bnNpZ25lZCBzaG9ydCBsX2xubm87CQkJLyogbGluZSBudW1iZXIgKi8K IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KKyNpZiAoX19HTlVDX18gPCAzKQorI3ByYWdt YSBwYWNrKCkKKyNlbmRpZgogCiAjZGVmaW5lIExJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5v CiAjZGVmaW5lIExJTkVTWglzaXplb2YoTElORU5PKQorLyogbWFrZSBzdXJlIHRoYXQgc3RydWN0 dXJlIHBhY2tpbmcgaXMgY29ycmVjdCAqLwordHlwZWRlZiBpbnQgX0RKQ0hLX0VYVExJTkVOT1so TElORVNaPT02KSozIC0gMV07CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAq KioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTY5LDYgKzE3Niw5IEBACiAjZGVmaW5lIEVfRklM Tk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwogI2RlZmluZSBFX0RJ TU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KIAorI2lm IChfX0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgogc3RydWN0IGV4dGVybmFs X3N5bWVudAogewogICB1bmlvbiB7CkBAIC0xODQsMTIgKzE5NCwxOCBAQAogICB1bnNpZ25lZCBj aGFyIGVfc2NsYXNzOwogICB1bnNpZ25lZCBjaGFyIGVfbnVtYXV4OwogfSBfX2F0dHJpYnV0ZV9f KChwYWNrZWQpKTsKKyNpZiAoX19HTlVDX18gPCAzKQorI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgog CiAjZGVmaW5lIE5fQlRNQVNLCSgweGYpCiAjZGVmaW5lIE5fVE1BU0sJCSgweDMwKQogI2RlZmlu ZSBOX0JUU0hGVAkoNCkKICNkZWZpbmUgTl9UU0hJRlQJKDIpCiAKKyNpZiAoX19HTlVDX18gPCAz KQorI3ByYWdtYSBwYWNrKDEpCisjZW5kaWYKIHVuaW9uIGV4dGVybmFsX2F1eGVudCB7CiAgIHN0 cnVjdCB7CiAgICAgVUxPTkczMiB4X3RhZ25keDsJCQkJCS8qIHN0ciwgdW4sIG9yIGVudW0gdGFn IGluZHggKi8KQEAgLTIzMywxMSArMjQ5LDE3IEBACiAgIH0gX19hdHRyaWJ1dGVfXygocGFja2Vk KSkgeF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9s IC50dikpICovCiAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjaWYgKF9fR05VQ19fIDwg MykKKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKIAogI2RlZmluZSBTWU1FTlQJc3RydWN0IGV4dGVy bmFsX3N5bWVudAogI2RlZmluZSBTWU1FU1oJc2l6ZW9mKFNZTUVOVCkKICNkZWZpbmUgQVVYRU5U CXVuaW9uIGV4dGVybmFsX2F1eGVudAogI2RlZmluZSBBVVhFU1oJc2l6ZW9mKEFVWEVOVCkKKy8q IG1ha2Ugc3VyZSB0aGF0IHN0cnVjdHVyZSBwYWNraW5nIGlzIGNvcnJlY3QgKi8KK3R5cGVkZWYg aW50IF9ESkNIS19FWFRTWU1FTlRbKFNZTUVTWj09MTgpKjMgLSAxXTsKK3R5cGVkZWYgaW50IF9E SkNIS19FWFRBVVhFTlRbKEFVWEVTWj09MTgpKjMgLSAxXTsKIAogCiAjZGVmaW5lIF9FVEVYVAki ZXRleHQiCkBAIC0zMjUsMTYgKzM0NywyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKiogUkVM T0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCiAKIAotCisjaWYgKF9f R05VQ19fIDwgMykKKyNwcmFnbWEgcGFjaygxKQorI2VuZGlmCiBzdHJ1Y3QgZXh0ZXJuYWxfcmVs b2MgewogICBVTE9ORzMyICAgICAgICByX3ZhZGRyOwogICBVTE9ORzMyICAgICAgICByX3N5bW5k eDsKICAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsK LQorI2lmIChfX0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2soKQorI2VuZGlmCiAKICNkZWZpbmUg UkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCiAjZGVmaW5lIFJFTFNaIHNpemVvZihSRUxPQykK Ky8qIG1ha2Ugc3VyZSB0aGF0IHN0cnVjdHVyZSBwYWNraW5nIGlzIGNvcnJlY3QgKi8KK3R5cGVk ZWYgaW50IF9ESkNIS19FWFRSRUxPQ1soUkVMU1o9PTEwKSozIC0gMV07CiAKICNkZWZpbmUgUkVM T0NfUkVMMzIJMjAJLyogMzItYml0IFBDLXJlbGF0aXZlIGFkZHJlc3MgKi8KICNkZWZpbmUgUkVM T0NfQUREUjMyCTYJLyogMzItYml0IGFic29sdXRlIGFkZHJlc3MgKi8KSW5kZXg6IGluY2x1ZGUv ZGlyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9kamdwcC9kamdwcC9pbmNsdWRlL2Rpci5o LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjgKZGlmZiAtdSAtcjEuOCBkaXIuaAotLS0gaW5jbHVk ZS9kaXIuaAkxNCBNYXkgMjAxNSAxNjoyMzowNSAtMDAwMAkxLjgKKysrIGluY2x1ZGUvZGlyLmgJ MTQgTWF5IDIwMTUgMTY6MzI6MjMgLTAwMDAKQEAgLTI0LDggKzI0LDkgQEAKICAgIGhvbGQgdGhl IGV4dHJhIGluZm9ybWF0aW9uLiAgRmllbGRzIG1hcmtlZCBMRk4gYXJlIG9ubHkgdmFsaWQgaWYg dGhlIG1hZ2ljCiAgICBpcyBzZXQgdG8gTEZOMzIgKi8KIAotLyogVGhpcyBpcyBmb3IgZysrIDIu Ny4yIGFuZCBiZWxvdyAqLworI2lmIChfX0dOVUNfXyA8IDMpIC8qIFRoaXMgaXMgZm9yIGcrKyAy LjcuMiBhbmQgYmVsb3cgKi8KICNwcmFnbWEgcGFjaygxKQorI2VuZGlmCiAKIHN0cnVjdCBmZmJs ayB7CiAgIGNoYXIgbGZuX21hZ2ljWzZdOwkJCS8qIExGTiAqLwpAQCAtNTQsNyArNTUsMTIgQEAK ICAgY2hhciAgICAgICAgICAgICAgIGZkX25hbWVbMTRdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNr ZWQpKTsKIAorI2lmIChfX0dOVUNfXyA8IDMpCiAjcHJhZ21hIHBhY2soKQorI2VuZGlmCisvKiBt YWtlIHN1cmUgdGhhdCBzdHJ1Y3R1cmUgcGFja2luZyBpcyBjb3JyZWN0ICovCit0eXBlZGVmIGlu dCBfREpDSEtfRkZCTEswWyhzaXplb2Yoc3RydWN0IGZmYmxrKSAgID09MjkwKSozIC0gMV07Cit0 eXBlZGVmIGludCBfREpDSEtfRkZCTEsxWyhzaXplb2Yoc3RydWN0IGZmYmxrbGZuKT09MzE4KSoz IC0gMV07CiAKICNkZWZpbmUgRkFfUkRPTkxZICAgICAgIDEKICNkZWZpbmUgRkFfSElEREVOICAg ICAgIDIKSW5kZXg6IGluY2x1ZGUvZG9zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9kamdw cC9kamdwcC9pbmNsdWRlL2Rvcy5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE2CmRpZmYgLXUg LXIxLjE2IGRvcy5oCi0tLSBpbmNsdWRlL2Rvcy5oCTE0IE1heSAyMDE1IDE2OjIzOjA1IC0wMDAw CTEuMTYKKysrIGluY2x1ZGUvZG9zLmgJMTQgTWF5IDIwMTUgMTY6MzI6MjMgLTAwMDAKQEAgLTIx NCw2ICsyMTQsOSBAQAogfTsKICNkZWZpbmUgZG9zdGltZV90IF9kb3N0aW1lX3QKIAorI2lmIChf X0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgogc3RydWN0IF9maW5kX3Qgewog ICBjaGFyIHJlc2VydmVkWzIxXTsKICAgdW5zaWduZWQgY2hhciBhdHRyaWI7CkBAIC0yMjIsNyAr MjI1LDEyIEBACiAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICAgY2hhciBuYW1lWzI1Nl07CiB9IF9f YXR0cmlidXRlX18oKHBhY2tlZCkpOworI2lmIChfX0dOVUNfXyA8IDMpCisjcHJhZ21hIHBhY2so KQorI2VuZGlmCiAjZGVmaW5lIGZpbmRfdCBfZmluZF90CisvKiBtYWtlIHN1cmUgdGhhdCBzdHJ1 Y3R1cmUgcGFja2luZyBpcyBjb3JyZWN0ICovCit0eXBlZGVmIGludCBfREpDSEtfRklORF9UWyhz aXplb2Yoc3RydWN0IF9maW5kX3QpPT0yODYpKjMgLSAxXTsKIAogc3RydWN0IF9kaXNrZnJlZV90 IHsKICAgdW5zaWduZWQgc2hvcnQgdG90YWxfY2x1c3RlcnM7Cg== --001a113f284e3eb22105160d4e5d--