From 9adef80d6b8da8b9eb6f1e9c5447942bb464e58d Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Thu, 12 Feb 2009 05:20:23 +0100 Subject: [PATCH] Replace all __attribute_packed by new __packed_struct macros. --- src/conf.h | 9 +-------- src/lefile.h | 19 +++++++----------- src/p_armpe.cpp | 6 ++---- src/p_djgpp2.h | 12 ++++-------- src/p_lx_elf.h | 30 ++++++++++++----------------- src/p_lx_exc.h | 15 ++++++--------- src/p_ps1.h | 24 ++++++++--------------- src/p_tos.h | 6 ++---- src/p_unix.h | 50 ++++++++++++++++++++---------------------------- src/p_vmlinx.cpp | 5 ++--- src/p_vmlinz.h | 9 ++++----- src/p_w32pe.cpp | 6 ++---- src/pefile.h | 26 +++++++++---------------- 13 files changed, 80 insertions(+), 137 deletions(-) diff --git a/src/conf.h b/src/conf.h index cb1c3485..fa107d88 100644 --- a/src/conf.h +++ b/src/conf.h @@ -307,22 +307,15 @@ #endif -#undef __attribute_packed #if (ACC_CC_INTELC && (__INTEL_COMPILER < 800)) #elif (0 && (ACC_ARCH_AMD64 || ACC_ARCH_I386)) #elif (ACC_CC_GNUC || ACC_CC_INTELC || ACC_CC_PATHSCALE) -# define __attribute_packed __attribute__((__packed__,__aligned__(1))) # define __packed_struct(s) struct s { -# define __packed_struct_end() } __attribute_packed; +# define __packed_struct_end() } __attribute__((__packed__,__aligned__(1))); #elif (ACC_CC_WATCOMC) -# define __attribute_packed # define __packed_struct(s) _Packed struct s { # define __packed_struct_end() }; #endif - -#if !defined(__attribute_packed) -# define __attribute_packed -#endif #if !defined(__packed_struct) # define __packed_struct(s) struct s { # define __packed_struct_end() }; diff --git a/src/lefile.h b/src/lefile.h index 24feb329..10002bbf 100644 --- a/src/lefile.h +++ b/src/lefile.h @@ -49,8 +49,8 @@ public: protected: enum { FIXUP_EXTRA = 3 }; - struct le_header_t - { // 0x00 + __packed_struct(le_header_t) + // 0x00 char _[2]; // signature: 'LE' || 'LX' char byte_order; // 0 little endian char word_order; // 0 little endian @@ -117,28 +117,23 @@ protected: LE16 device_id; LE16 ddk_version; #endif - } - __attribute_packed; + __packed_struct_end() - struct le_object_table_entry_t - { + __packed_struct(le_object_table_entry_t) LE32 virtual_size; LE32 base_address; LE32 flags; LE32 pagemap_index; LE32 npages; LE32 reserved; - } - __attribute_packed; + __packed_struct_end() - struct le_pagemap_entry_t - { + __packed_struct(le_pagemap_entry_t) unsigned char h; unsigned char m; unsigned char l; unsigned char type; // 0x00-legal;0x40-iterated;0x80-invalid;0xC0-zeroed - } - __attribute_packed; + __packed_struct_end() virtual void readObjectTable(); virtual void writeObjectTable(); diff --git a/src/p_armpe.cpp b/src/p_armpe.cpp index d986417a..06bf3db1 100644 --- a/src/p_armpe.cpp +++ b/src/p_armpe.cpp @@ -148,14 +148,12 @@ Linker* PackArmPe::newLinker() const // import handling **************************************************************************/ -struct import_desc -{ +__packed_struct(import_desc) LE32 oft; // orig first thunk char _[8]; LE32 dllname; LE32 iat; // import address table -} -__attribute_packed; +__packed_struct_end() void PackArmPe::processImports(unsigned myimport, unsigned iat_off) // pass 2 { diff --git a/src/p_djgpp2.h b/src/p_djgpp2.h index 92cefcd3..38f11c71 100644 --- a/src/p_djgpp2.h +++ b/src/p_djgpp2.h @@ -66,19 +66,16 @@ protected: long coff_offset; - struct external_scnhdr_t - { + __packed_struct(external_scnhdr_t) char _[12]; // name, paddr LE32 vaddr; LE32 size; LE32 scnptr; char misc[12]; // relptr, lnnoptr, nreloc, nlnno char __[4]; // flags - } - __attribute_packed; + __packed_struct_end() - struct coff_header_t - { + __packed_struct(coff_header_t) // ext_file_hdr LE16 f_magic; LE16 f_nscns; @@ -99,8 +96,7 @@ protected: // section headers external_scnhdr_t sh[3]; - } - __attribute_packed; + __packed_struct_end() coff_header_t coff_hdr; external_scnhdr_t *text,*data,*bss; diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index 30a27660..4b6cc12c 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -145,26 +145,23 @@ protected: Elf32_Shdr const *sec_dynsym; Elf32_Shdr const *sec_dynstr; - struct cprElfHdr1 { + __packed_struct(cprElfHdr1) Elf32_Ehdr ehdr; Elf32_Phdr phdr[1]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr2 { + __packed_struct(cprElfHdr2) Elf32_Ehdr ehdr; Elf32_Phdr phdr[2]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr3 { + __packed_struct(cprElfHdr3) Elf32_Ehdr ehdr; Elf32_Phdr phdr[3]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() cprElfHdr3 elfout; @@ -227,26 +224,23 @@ protected: Elf64_Phdr *phdri; // for input file acc_uint64l_t page_mask; // AND clears the offset-within-page - struct cprElfHdr1 { + __packed_struct(cprElfHdr1) Elf64_Ehdr ehdr; Elf64_Phdr phdr[1]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr2 { + __packed_struct(cprElfHdr2) Elf64_Ehdr ehdr; Elf64_Phdr phdr[2]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr3 { + __packed_struct(cprElfHdr3) Elf64_Ehdr ehdr; Elf64_Phdr phdr[3]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() cprElfHdr3 elfout; diff --git a/src/p_lx_exc.h b/src/p_lx_exc.h index 479b6537..736262f9 100644 --- a/src/p_lx_exc.h +++ b/src/p_lx_exc.h @@ -87,26 +87,23 @@ protected: unsigned n_mru; - struct cprElfHdr1 { + __packed_struct(cprElfHdr1) Elf_LE32_Ehdr ehdr; Elf_LE32_Phdr phdr[1]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr2 { + __packed_struct(cprElfHdr2) Elf_LE32_Ehdr ehdr; Elf_LE32_Phdr phdr[2]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() - struct cprElfHdr3 { + __packed_struct(cprElfHdr3) Elf_LE32_Ehdr ehdr; Elf_LE32_Phdr phdr[3]; l_info linfo; - } - __attribute_packed; + __packed_struct_end() cprElfHdr3 elfout; diff --git a/src/p_ps1.h b/src/p_ps1.h index 7b1b7f4a..9bf91912 100644 --- a/src/p_ps1.h +++ b/src/p_ps1.h @@ -67,8 +67,7 @@ protected: virtual int readFileHeader(); virtual bool checkFileHeader(); - struct ps1_exe_t - { + __packed_struct(ps1_exe_t) // ident string char id[8]; // is NULL @@ -91,33 +90,26 @@ protected: char origin[60]; // backup of the original header (epc - is_len) // id & the upx header ... - } - __attribute_packed; + __packed_struct_end() // for unpack - struct ps1_exe_hb_t - { + __packed_struct(ps1_exe_hb_t) LE32 ih_bkup[10]; // plus checksum for the backup LE32 ih_csum; - } - __attribute_packed; + __packed_struct_end() - struct ps1_exe_chb_t - { + __packed_struct(ps1_exe_chb_t) unsigned char id; unsigned char len; LE16 ih_csum; unsigned char ih_bkup; - } - __attribute_packed; + __packed_struct_end() - struct bss_nfo - { + __packed_struct(bss_nfo) LE16 hi1, op1, lo1, op2; LE16 hi2, op3, lo2, op4; - } - __attribute_packed; + __packed_struct_end() ps1_exe_t ih, oh; ps1_exe_hb_t bh; diff --git a/src/p_tos.h b/src/p_tos.h index fcca7216..445f6257 100644 --- a/src/p_tos.h +++ b/src/p_tos.h @@ -62,8 +62,7 @@ protected: virtual int readFileHeader(); virtual bool checkFileHeader(); - struct tos_header_t - { + __packed_struct(tos_header_t) BE16 fh_magic; BE32 fh_text; BE32 fh_data; @@ -72,8 +71,7 @@ protected: BE32 fh_reserved; BE32 fh_flag; BE16 fh_reloc; - } - __attribute_packed; + __packed_struct_end() tos_header_t ih, oh; diff --git a/src/p_unix.h b/src/p_unix.h index 2b1383ef..02ce461a 100644 --- a/src/p_unix.h +++ b/src/p_unix.h @@ -92,30 +92,28 @@ protected: unsigned b_len; // total length of b_info blocks // must agree with stub/linux.hh - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block unsigned sz_unc; // uncompressed_size unsigned sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused; - } - __attribute_packed; - struct l_info { // 12-byte trailer in header for loader + __packed_struct_end() + + __packed_struct(l_info) // 12-byte trailer in header for loader LE32 l_checksum; LE32 l_magic; LE16 l_lsize; unsigned char l_version; unsigned char l_format; - } - __attribute_packed; + __packed_struct_end() - struct p_info { // 12-byte packed program header + __packed_struct(p_info) // 12-byte packed program header unsigned p_progid; unsigned p_filesize; unsigned p_blocksize; - } - __attribute_packed; + __packed_struct_end() struct l_info linfo; @@ -135,31 +133,28 @@ protected: PackUnixBe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::be_policy; } // must agree with stub/linux.hh - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block BE32 sz_unc; // uncompressed_size BE32 sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused; - } - __attribute_packed; - struct l_info { // 12-byte trailer in header for loader + __packed_struct_end() + + __packed_struct(l_info) // 12-byte trailer in header for loader BE32 l_checksum; BE32 l_magic; BE16 l_lsize; unsigned char l_version; unsigned char l_format; - } - __attribute_packed; + __packed_struct_end() - struct p_info { // 12-byte packed program header + __packed_struct(p_info) // 12-byte packed program header BE32 p_progid; BE32 p_filesize; BE32 p_blocksize; - } - __attribute_packed; - + __packed_struct_end() }; @@ -170,31 +165,28 @@ protected: PackUnixLe32(InputFile *f) : super(f) { bele = &N_BELE_RTP::le_policy; } // must agree with stub/linux.hh - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block LE32 sz_unc; // uncompressed_size LE32 sz_cpr; // compressed_size unsigned char b_method; // compression algorithm unsigned char b_ftid; // filter id unsigned char b_cto8; // filter parameter unsigned char b_unused; - } - __attribute_packed; - struct l_info { // 12-byte trailer in header for loader + __packed_struct_end() + + __packed_struct(l_info) // 12-byte trailer in header for loader LE32 l_checksum; LE32 l_magic; LE16 l_lsize; unsigned char l_version; unsigned char l_format; - } - __attribute_packed; + __packed_struct_end() - struct p_info { // 12-byte packed program header + __packed_struct(p_info) // 12-byte packed program header LE32 p_progid; LE32 p_filesize; LE32 p_blocksize; - } - __attribute_packed; - + __packed_struct_end() }; diff --git a/src/p_vmlinx.cpp b/src/p_vmlinx.cpp index 8f2e3e9b..33ef71b3 100644 --- a/src/p_vmlinx.cpp +++ b/src/p_vmlinx.cpp @@ -301,7 +301,7 @@ void PackVmlinuxBase::pack(OutputFile *fo) if (UPX_E_OK!=r || len_unc<=len_cpr) // FIXME: allow no compression throwInternalError("Ehdr compression failed"); - struct b_info { // 12-byte header before each compressed block + __packed_struct(b_info) // 12-byte header before each compressed block unsigned sz_unc; // uncompressed_size unsigned sz_cpr; // compressed_size unsigned char b_method; // compression algorithm @@ -309,8 +309,7 @@ void PackVmlinuxBase::pack(OutputFile *fo) unsigned char b_cto8; // filter parameter unsigned char b_unused; // FIXME: !=0 for partial-block unfilter // unsigned f_offset, f_len; // only if partial-block unfilter - } - __attribute_packed; + __packed_struct_end() struct b_info hdr_info; set_be32(&hdr_info.sz_unc, len_unc); diff --git a/src/p_vmlinz.h b/src/p_vmlinz.h index 89ef192d..7f8f72f9 100644 --- a/src/p_vmlinz.h +++ b/src/p_vmlinz.h @@ -64,8 +64,7 @@ protected: // virtual upx_byte *getLoader() const; // virtual int getLoaderSize() const; - struct boot_sect_t - { + __packed_struct(boot_sect_t) char _[0x1f1]; unsigned char setup_sects; char __[2]; @@ -86,11 +85,11 @@ protected: char _8[0x248 - (0x234 + 1)]; LE32 payload_offset; LE32 payload_length; - // some more uninteresting fields here ... // see /usr/src/linux/Documentation/i386/boot.txt - } - __attribute_packed h; + __packed_struct_end() + + boot_sect_t h; MemBuffer setup_buf; int setup_size; diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 640aaa78..5447ca34 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -173,14 +173,12 @@ int PackW32Pe::readFileHeader() // import handling **************************************************************************/ -struct import_desc -{ +__packed_struct(import_desc) LE32 oft; // orig first thunk char _[8]; LE32 dllname; LE32 iat; // import address table -} -__attribute_packed; +__packed_struct_end() void PackW32Pe::processImports(unsigned myimport, unsigned) // pass 2 { diff --git a/src/pefile.h b/src/pefile.h index 1e3f51b5..69f4c5f8 100644 --- a/src/pefile.h +++ b/src/pefile.h @@ -106,8 +106,7 @@ protected: unsigned crelocs; // rva of preprocessed fixups int big_relocs; - struct pe_header_t - { + __packed_struct(pe_header_t) // 0x0 char _[4]; // pemagic LE16 cpu; @@ -142,19 +141,15 @@ protected: // 0x74 LE32 ddirsentries; // usually 16 - struct ddirs_t - { + __packed_struct(ddirs_t) LE32 vaddr; LE32 size; - } - __attribute_packed; + __packed_struct_end() - struct ddirs_t ddirs[16]; - } - __attribute_packed; + ddirs_t ddirs[16]; + __packed_struct_end() - struct pe_section_t - { + __packed_struct(pe_section_t) char name[8]; LE32 vsize; LE32 vaddr; @@ -162,8 +157,7 @@ protected: LE32 rawdataptr; char _[12]; LE32 flags; - } - __attribute_packed; + __packed_struct_end() pe_header_t ih, oh; pe_section_t *isection; @@ -333,8 +327,7 @@ protected: class Export : private noncopyable { - struct export_dir_t - { + __packed_struct(export_dir_t) char _[12]; // flags, timedate, version LE32 name; char __[4]; // ordinal base @@ -343,8 +336,7 @@ protected: LE32 addrtable; LE32 nameptrtable; LE32 ordinaltable; - } - __attribute_packed; + __packed_struct_end() export_dir_t edir; char *ename;