Hi Thomas,

On Mon, May 28, 2018 at 01:26:24PM +0200, Thomas Bogendoerfer wrote:
> Use fixed width integer types for ecoff structs to make elf2ecoff work
> on 64bit host machines
> 
> Signed-off-by: Thomas Bogendoerfer <tbogendoer...@suse.de>
> ---
>  arch/mips/boot/ecoff.h     | 58 
> +++++++++++++++++++++++-----------------------
>  arch/mips/boot/elf2ecoff.c | 29 +++++++++++------------
>  2 files changed, 43 insertions(+), 44 deletions(-)
> 
> diff --git a/arch/mips/boot/ecoff.h b/arch/mips/boot/ecoff.h
> index b3e73c22c345..9eb4167ef979 100644
> --- a/arch/mips/boot/ecoff.h
> +++ b/arch/mips/boot/ecoff.h
> @@ -3,13 +3,13 @@
>   * Some ECOFF definitions.
>   */

Perhaps we should #include <stdint.h> before making use of the types it
provides?

I guess if this builds then in practice some other header included by
elf2ecoff.c already pulls it in, but it'd be nice to be explicit about
what ecoff.h needs.

>  typedef struct filehdr {
> -     unsigned short  f_magic;        /* magic number */
> -     unsigned short  f_nscns;        /* number of sections */
> -     long            f_timdat;       /* time & date stamp */
> -     long            f_symptr;       /* file pointer to symbolic header */
> -     long            f_nsyms;        /* sizeof(symbolic hdr) */
> -     unsigned short  f_opthdr;       /* sizeof(optional hdr) */
> -     unsigned short  f_flags;        /* flags */
> +     uint16_t        f_magic;        /* magic number */
> +     uint16_t        f_nscns;        /* number of sections */
> +     int32_t         f_timdat;       /* time & date stamp */
> +     int32_t         f_symptr;       /* file pointer to symbolic header */
> +     int32_t         f_nsyms;        /* sizeof(symbolic hdr) */
> +     uint16_t        f_opthdr;       /* sizeof(optional hdr) */
> +     uint16_t        f_flags;        /* flags */
>  } FILHDR;
>  #define FILHSZ       sizeof(FILHDR)
>  
> @@ -18,32 +18,32 @@ typedef struct filehdr {
>  
>  typedef struct scnhdr {
>       char            s_name[8];      /* section name */
> -     long            s_paddr;        /* physical address, aliased s_nlib */
> -     long            s_vaddr;        /* virtual address */
> -     long            s_size;         /* section size */
> -     long            s_scnptr;       /* file ptr to raw data for section */
> -     long            s_relptr;       /* file ptr to relocation */
> -     long            s_lnnoptr;      /* file ptr to gp histogram */
> -     unsigned short  s_nreloc;       /* number of relocation entries */
> -     unsigned short  s_nlnno;        /* number of gp histogram entries */
> -     long            s_flags;        /* flags */
> +     int32_t         s_paddr;        /* physical address, aliased s_nlib */
> +     int32_t         s_vaddr;        /* virtual address */
> +     int32_t         s_size;         /* section size */
> +     int32_t         s_scnptr;       /* file ptr to raw data for section */
> +     int32_t         s_relptr;       /* file ptr to relocation */
> +     int32_t         s_lnnoptr;      /* file ptr to gp histogram */
> +     uint16_t        s_nreloc;       /* number of relocation entries */
> +     uint16_t        s_nlnno;        /* number of gp histogram entries */
> +     int32_t         s_flags;        /* flags */
>  } SCNHDR;
>  #define SCNHSZ               sizeof(SCNHDR)
> -#define SCNROUND     ((long)16)
> +#define SCNROUND     ((int32_t)16)
>  
>  typedef struct aouthdr {
> -     short   magic;          /* see above                            */
> -     short   vstamp;         /* version stamp                        */
> -     long    tsize;          /* text size in bytes, padded to DW bdry*/
> -     long    dsize;          /* initialized data "  "                */
> -     long    bsize;          /* uninitialized data "   "             */
> -     long    entry;          /* entry pt.                            */
> -     long    text_start;     /* base of text used for this file      */
> -     long    data_start;     /* base of data used for this file      */
> -     long    bss_start;      /* base of bss used for this file       */
> -     long    gprmask;        /* general purpose register mask        */
> -     long    cprmask[4];     /* co-processor register masks          */
> -     long    gp_value;       /* the gp value used for this object    */
> +     int16_t magic;          /* see above                            */
> +     int16_t vstamp;         /* version stamp                        */
> +     int32_t tsize;          /* text size in bytes, padded to DW bdry*/
> +     int32_t dsize;          /* initialized data "  "                */
> +     int32_t bsize;          /* uninitialized data "   "             */
> +     int32_t entry;          /* entry pt.                            */
> +     int32_t text_start;     /* base of text used for this file      */
> +     int32_t data_start;     /* base of data used for this file      */
> +     int32_t bss_start;      /* base of bss used for this file       */
> +     int32_t gprmask;        /* general purpose register mask        */
> +     int32_t cprmask[4];     /* co-processor register masks          */
> +     int32_t gp_value;       /* the gp value used for this object    */
>  } AOUTHDR;
>  #define AOUTHSZ sizeof(AOUTHDR)
>  
> diff --git a/arch/mips/boot/elf2ecoff.c b/arch/mips/boot/elf2ecoff.c
> index 266c8137e859..8322282f93b0 100644
> --- a/arch/mips/boot/elf2ecoff.c
> +++ b/arch/mips/boot/elf2ecoff.c
> @@ -55,8 +55,8 @@
>  /* -------------------------------------------------------------------- */
>  
>  struct sect {
> -     unsigned long vaddr;
> -     unsigned long len;
> +     uint32_t vaddr;
> +     uint32_t len;
>  };
>  
>  int *symTypeTable;
> @@ -153,16 +153,16 @@ static char *saveRead(int file, off_t offset, off_t 
> len, char *name)
>  }
>  
>  #define swab16(x) \
> -     ((unsigned short)( \
> -             (((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
> -             (((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
> +     ((uint16_t)( \
> +             (((uint16_t)(x) & (uint16_t)0x00ffU) << 8) | \
> +             (((uint16_t)(x) & (uint16_t)0xff00U) >> 8) ))
>  
>  #define swab32(x) \
>       ((unsigned int)( \
> -             (((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
> -             (((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \
> -             (((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \
> -             (((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
> +             (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) | \
> +             (((uint32_t)(x) & (uint32_t)0x0000ff00UL) <<  8) | \
> +             (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >>  8) | \
> +             (((uint32_t)(x) & (uint32_t)0xff000000UL) >> 24) ))
>  
>  static void convert_elf_hdr(Elf32_Ehdr * e)
>  {
> @@ -274,7 +274,7 @@ int main(int argc, char *argv[])
>       struct aouthdr eah;
>       struct scnhdr esecs[6];
>       int infile, outfile;
> -     unsigned long cur_vma = ULONG_MAX;
> +     uint32_t cur_vma = UINT32_MAX;
>       int addflag = 0;
>       int nosecs;
>  
> @@ -518,7 +518,7 @@ int main(int argc, char *argv[])
>  
>               for (i = 0; i < nosecs; i++) {
>                       printf
> -                         ("Section %d: %s phys %lx  size %lx  file offset 
> %lx\n",
> +                         ("Section %d: %s phys %x  size %x    file offset 
> %x\n",

Maybe #include <inttypes.h>, then use PRIx32 & co here & below?

Thanks,
    Paul

>                            i, esecs[i].s_name, esecs[i].s_paddr,
>                            esecs[i].s_size, esecs[i].s_scnptr);
>               }
> @@ -564,17 +564,16 @@ int main(int argc, char *argv[])
>                  the section can be loaded before copying. */
>               if (ph[i].p_type == PT_LOAD && ph[i].p_filesz) {
>                       if (cur_vma != ph[i].p_vaddr) {
> -                             unsigned long gap =
> -                                 ph[i].p_vaddr - cur_vma;
> +                             uint32_t gap = ph[i].p_vaddr - cur_vma;
>                               char obuf[1024];
>                               if (gap > 65536) {
>                                       fprintf(stderr,
> -                                             "Intersegment gap (%ld bytes) 
> too large.\n",
> +                                             "Intersegment gap (%d bytes) 
> too large.\n",
>                                               gap);
>                                       exit(1);
>                               }
>                               fprintf(stderr,
> -                                     "Warning: %ld byte intersegment gap.\n",
> +                                     "Warning: %d byte intersegment gap.\n",
>                                       gap);
>                               memset(obuf, 0, sizeof obuf);
>                               while (gap) {
> -- 
> 2.13.6
> 
> 

Reply via email to