| [69cde8d] | 1 | Submitted By: Jim Gifford (patches at jg555 dot com)
 | 
|---|
 | 2 | Date: 2006-01-03
 | 
|---|
 | 3 | Initial Package Version: 2.3
 | 
|---|
 | 4 | Origin: Dave Miller
 | 
|---|
 | 5 | Upstream Status: Unknown
 | 
|---|
 | 6 | Description: Fixes 64 Bit Issues with Elftoaout
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 |         http://marc.theaimsgroup.com/?l=linux-sparc&m=113617505627794&w=2
 | 
|---|
 | 9 |  
 | 
|---|
 | 10 | diff -Naur elftoaout-2.3.orig/elftoaout.c elftoaout-2.3/elftoaout.c
 | 
|---|
 | 11 | --- elftoaout-2.3.orig/elftoaout.c      2000-06-03 20:20:12.000000000 +0000
 | 
|---|
 | 12 | +++ elftoaout-2.3/elftoaout.c   2006-01-03 22:33:28.000000000 +0000
 | 
|---|
 | 13 | @@ -20,16 +20,36 @@
 | 
|---|
 | 14 |   */
 | 
|---|
 | 15 |  #include <stdio.h>
 | 
|---|
 | 16 |  #include <stdlib.h>
 | 
|---|
 | 17 | -#ifdef linux
 | 
|---|
 | 18 |  #include <linux/elf.h>
 | 
|---|
 | 19 | -#define ELFDATA2MSB   2
 | 
|---|
 | 20 | -#else
 | 
|---|
 | 21 | -#include <sys/elf.h>
 | 
|---|
 | 22 | -#endif
 | 
|---|
 | 23 | -
 | 
|---|
 | 24 | -#define swab16(x)  (((x)<<8&0xFF00)|((x)>>8&0x00FF))
 | 
|---|
 | 25 | -#define swab32(x)  (((x)<<24&0xFF000000)|((x)<<8&0x00FF0000)|((x)>>24&0x000000FF)|((x)>>8&0x0000FF00))
 | 
|---|
 | 26 | -#define swab64(x)  ((((unsigned long long)(swab32((unsigned int)x))) << 32) | (swab32(((unsigned long long)x)>>32)))
 | 
|---|
 | 27 | +#include <sys/types.h>
 | 
|---|
 | 28 | +
 | 
|---|
 | 29 | +static inline u_int16_t swab16(u_int16_t x)
 | 
|---|
 | 30 | +{
 | 
|---|
 | 31 | +       return (((x << 8)  & 0xFF00) |
 | 
|---|
 | 32 | +               ((x >> 8) & 0x00FF));
 | 
|---|
 | 33 | +}
 | 
|---|
 | 34 | +
 | 
|---|
 | 35 | +static inline u_int32_t swab32(u_int32_t x)
 | 
|---|
 | 36 | +{
 | 
|---|
 | 37 | +       return (((x << 24) & 0xFF000000) |
 | 
|---|
 | 38 | +               ((x <<  8) & 0x00FF0000) |
 | 
|---|
 | 39 | +               ((x >> 24) & 0x000000FF) |
 | 
|---|
 | 40 | +               ((x >>  8) & 0x0000FF00));
 | 
|---|
 | 41 | +}
 | 
|---|
 | 42 | +
 | 
|---|
 | 43 | +static inline u_int64_t swab64(u_int64_t x)
 | 
|---|
 | 44 | +{
 | 
|---|
 | 45 | +       return ((u_int64_t)
 | 
|---|
 | 46 | +       ((u_int64_t)(((u_int64_t)x & (u_int64_t)0x00000000000000ffULL) << 56) |
 | 
|---|
 | 47 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0x000000000000ff00ULL) << 40) |
 | 
|---|
 | 48 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0x0000000000ff0000ULL) << 24) |
 | 
|---|
 | 49 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0x00000000ff000000ULL) <<  8) |
 | 
|---|
 | 50 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0x000000ff00000000ULL) >>  8) |
 | 
|---|
 | 51 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0x0000ff0000000000ULL) >> 24) |
 | 
|---|
 | 52 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0x00ff000000000000ULL) >> 40) |
 | 
|---|
 | 53 | +        (u_int64_t)(((u_int64_t)x & (u_int64_t)0xff00000000000000ULL) >> 56)));
 | 
|---|
 | 54 | +}
 | 
|---|
 | 55 | +
 | 
|---|
 | 56 |  
 | 
|---|
 | 57 |  /* We carry a.out header here in order to compile the thing on Solaris */
 | 
|---|
 | 58 |  
 | 
|---|
 | 59 | @@ -37,14 +57,14 @@
 | 
|---|
 | 60 |  #define        CMAGIC      0x01030108
 | 
|---|
 | 61 |  
 | 
|---|
 | 62 |  typedef struct {
 | 
|---|
 | 63 | -       unsigned long   a_magic;        /* magic number */
 | 
|---|
 | 64 | -       unsigned long   a_text;         /* size of text segment */
 | 
|---|
 | 65 | -       unsigned long   a_data;         /* size of initialized data */
 | 
|---|
 | 66 | -       unsigned long   a_bss;          /* size of uninitialized data */
 | 
|---|
 | 67 | -       unsigned long   a_syms;         /* size of symbol table || checksum */
 | 
|---|
 | 68 | -       unsigned long   a_entry;        /* entry point */
 | 
|---|
 | 69 | -       unsigned long   a_trsize;       /* size of text relocation */
 | 
|---|
 | 70 | -       unsigned long   a_drsize;       /* size of data relocation */
 | 
|---|
 | 71 | +       u_int32_t       a_magic;        /* magic number */
 | 
|---|
 | 72 | +       u_int32_t       a_text;         /* size of text segment */
 | 
|---|
 | 73 | +       u_int32_t       a_data;         /* size of initialized data */
 | 
|---|
 | 74 | +       u_int32_t       a_bss;          /* size of uninitialized data */
 | 
|---|
 | 75 | +       u_int32_t       a_syms;         /* size of symbol table || checksum */
 | 
|---|
 | 76 | +       u_int32_t       a_entry;        /* entry point */
 | 
|---|
 | 77 | +       u_int32_t       a_trsize;       /* size of text relocation */
 | 
|---|
 | 78 | +       u_int32_t       a_drsize;       /* size of data relocation */
 | 
|---|
 | 79 |  } Exec;
 | 
|---|
 | 80 |  
 | 
|---|
 | 81 |  
 | 
|---|
 | 82 | @@ -56,17 +76,16 @@
 | 
|---|
 | 83 |         int swab;
 | 
|---|
 | 84 |         int sparc64;
 | 
|---|
 | 85 |         int csum;
 | 
|---|
 | 86 | -       /* friend void Usage(void); */
 | 
|---|
 | 87 |  } Application;
 | 
|---|
 | 88 |  
 | 
|---|
 | 89 |  typedef struct {
 | 
|---|
 | 90 |         Elf32_Phdr *tab;
 | 
|---|
 | 91 | -       unsigned len;
 | 
|---|
 | 92 | +       unsigned int len;
 | 
|---|
 | 93 |  } ProgTable;
 | 
|---|
 | 94 |  
 | 
|---|
 | 95 |  typedef struct {
 | 
|---|
 | 96 |         Elf64_Phdr *tab;
 | 
|---|
 | 97 | -       unsigned len;
 | 
|---|
 | 98 | +       unsigned int len;
 | 
|---|
 | 99 |  } ProgTable64;
 | 
|---|
 | 100 |  
 | 
|---|
 | 101 |  void get_ptab(ProgTable *t, FILE *inp, const Elf32_Ehdr *h);
 | 
|---|
 | 102 | @@ -75,9 +94,9 @@
 | 
|---|
 | 103 |  void print_ptab64(ProgTable64 *t);
 | 
|---|
 | 104 |  
 | 
|---|
 | 105 |  typedef struct {
 | 
|---|
 | 106 | -       char *buf;                /* Image data */
 | 
|---|
 | 107 | -       unsigned len;             /* Length of buffer */
 | 
|---|
 | 108 | -       unsigned bss;             /* Length of extra data */
 | 
|---|
 | 109 | +       unsigned char *buf;       /* Image data */
 | 
|---|
 | 110 | +       unsigned int len;         /* Length of buffer */
 | 
|---|
 | 111 | +       unsigned int bss;         /* Length of extra data */
 | 
|---|
 | 112 |  } Segment;
 | 
|---|
 | 113 |  
 | 
|---|
 | 114 |  void load_image(Segment *t, const ProgTable *h, FILE *inp);
 | 
|---|
 | 115 | @@ -105,7 +124,8 @@
 | 
|---|
 | 116 |  
 | 
|---|
 | 117 |         parse_args(&prog, argc, argv);
 | 
|---|
 | 118 |  
 | 
|---|
 | 119 | -       if (prog.version) Version();
 | 
|---|
 | 120 | +       if (prog.version)
 | 
|---|
 | 121 | +               Version();
 | 
|---|
 | 122 |  
 | 
|---|
 | 123 |         if (freopen(prog.iname, "r", stdin) == NULL) {
 | 
|---|
 | 124 |                 fprintf(stderr, "Cannot open \"%s\"\n", prog.iname);
 | 
|---|
 | 125 | @@ -141,7 +161,8 @@
 | 
|---|
 | 126 |         exit(0);
 | 
|---|
 | 127 |  }
 | 
|---|
 | 128 |  
 | 
|---|
 | 129 | -void parse_args( Application *t, unsigned argc, const char **argv ){
 | 
|---|
 | 130 | +void parse_args( Application *t, unsigned argc, const char **argv )
 | 
|---|
 | 131 | +{
 | 
|---|
 | 132 |         const char *arg;
 | 
|---|
 | 133 |         union {
 | 
|---|
 | 134 |                 char c[4];
 | 
|---|
 | 135 | @@ -185,8 +206,8 @@
 | 
|---|
 | 136 |         if (t->csum && t->sun4_mode) Usage ();  /* Checksum lives in header. */
 | 
|---|
 | 137 |  }
 | 
|---|
 | 138 |  
 | 
|---|
 | 139 | -void get_header(Elf32_Ehdr *t, FILE *inp) {
 | 
|---|
 | 140 | -
 | 
|---|
 | 141 | +void get_header(Elf32_Ehdr *t, FILE *inp)
 | 
|---|
 | 142 | +{
 | 
|---|
 | 143 |          if (fread((void*) t, sizeof(Elf64_Ehdr), 1, inp) != 1) {
 | 
|---|
 | 144 |                 fprintf(stderr, "Read error on header\n");
 | 
|---|
 | 145 |                 exit(1);
 | 
|---|
 | 146 | @@ -249,8 +270,9 @@
 | 
|---|
 | 147 |         }
 | 
|---|
 | 148 |  }
 | 
|---|
 | 149 |  
 | 
|---|
 | 150 | -void get_ptab(ProgTable *t, FILE *inp, const Elf32_Ehdr *h) {
 | 
|---|
 | 151 | -       unsigned x;
 | 
|---|
 | 152 | +void get_ptab(ProgTable *t, FILE *inp, const Elf32_Ehdr *h)
 | 
|---|
 | 153 | +{
 | 
|---|
 | 154 | +       unsigned int x;
 | 
|---|
 | 155 |  
 | 
|---|
 | 156 |         /** fprintf(stderr, "Program header table off = 0x%x\n",
 | 
|---|
 | 157 |                 (unsigned) h->e_phoff); **/
 | 
|---|
 | 158 | @@ -294,8 +316,9 @@
 | 
|---|
 | 159 |         }
 | 
|---|
 | 160 |  }
 | 
|---|
 | 161 |  
 | 
|---|
 | 162 | -void get_ptab64(ProgTable64 *t, FILE *inp, const Elf64_Ehdr *h) {
 | 
|---|
 | 163 | -       unsigned x;
 | 
|---|
 | 164 | +void get_ptab64(ProgTable64 *t, FILE *inp, const Elf64_Ehdr *h)
 | 
|---|
 | 165 | +{
 | 
|---|
 | 166 | +       unsigned int x;
 | 
|---|
 | 167 |  
 | 
|---|
 | 168 |         if (h->e_phoff == 0) {
 | 
|---|
 | 169 |                 fprintf(stderr, "No Program Header Table\n");
 | 
|---|
 | 170 | @@ -332,8 +355,9 @@
 | 
|---|
 | 171 |         }
 | 
|---|
 | 172 |  }
 | 
|---|
 | 173 |  
 | 
|---|
 | 174 | -void print_ptab(ProgTable *t) {
 | 
|---|
 | 175 | -       unsigned x;
 | 
|---|
 | 176 | +void print_ptab(ProgTable *t)
 | 
|---|
 | 177 | +{
 | 
|---|
 | 178 | +       unsigned int x;
 | 
|---|
 | 179 |         const Elf32_Phdr *p;
 | 
|---|
 | 180 |  
 | 
|---|
 | 181 |         for (x = 0; x < t->len; x++) {
 | 
|---|
 | 182 | @@ -374,8 +398,9 @@
 | 
|---|
 | 183 |         }
 | 
|---|
 | 184 |  }
 | 
|---|
 | 185 |  
 | 
|---|
 | 186 | -void print_ptab64(ProgTable64 *t) {
 | 
|---|
 | 187 | -       unsigned x;
 | 
|---|
 | 188 | +void print_ptab64(ProgTable64 *t)
 | 
|---|
 | 189 | +{
 | 
|---|
 | 190 | +       unsigned int x;
 | 
|---|
 | 191 |         const Elf64_Phdr *p;
 | 
|---|
 | 192 |  
 | 
|---|
 | 193 |         for (x = 0; x < t->len; x++) {
 | 
|---|
 | 194 | @@ -387,8 +412,11 @@
 | 
|---|
 | 195 |                         break;
 | 
|---|
 | 196 |                 case PT_LOAD:
 | 
|---|
 | 197 |                         printf("Loadable to 0x%Lx[0x%Lx] from 0x%Lx[0x%Lx] align 0x%Lx",
 | 
|---|
 | 198 | -                               p->p_vaddr, p->p_memsz, p->p_offset, p->p_filesz,
 | 
|---|
 | 199 | -                               p->p_align);
 | 
|---|
 | 200 | +                              (unsigned long long) p->p_vaddr,
 | 
|---|
 | 201 | +                              (unsigned long long) p->p_memsz,
 | 
|---|
 | 202 | +                              (unsigned long long) p->p_offset,
 | 
|---|
 | 203 | +                              (unsigned long long) p->p_filesz,
 | 
|---|
 | 204 | +                              (unsigned long long) p->p_align);
 | 
|---|
 | 205 |                         break;
 | 
|---|
 | 206 |                 case PT_DYNAMIC:
 | 
|---|
 | 207 |                         printf("Dynamic");
 | 
|---|
 | 208 | @@ -416,9 +444,10 @@
 | 
|---|
 | 209 |         }
 | 
|---|
 | 210 |  }
 | 
|---|
 | 211 |  
 | 
|---|
 | 212 | -void load_image(Segment *t, const ProgTable *tp, FILE *inp) {
 | 
|---|
 | 213 | +void load_image(Segment *t, const ProgTable *tp, FILE *inp)
 | 
|---|
 | 214 | +{
 | 
|---|
 | 215 |         Elf32_Phdr *p, *q;
 | 
|---|
 | 216 | -       unsigned x;
 | 
|---|
 | 217 | +       unsigned int x;
 | 
|---|
 | 218 |         unsigned long off, len;
 | 
|---|
 | 219 |  
 | 
|---|
 | 220 |         p = 0;
 | 
|---|
 | 221 | @@ -484,9 +513,10 @@
 | 
|---|
 | 222 |         }
 | 
|---|
 | 223 |  }
 | 
|---|
 | 224 |  
 | 
|---|
 | 225 | -void load_image64(Segment *t, const ProgTable64 *tp, FILE *inp) {
 | 
|---|
 | 226 | +void load_image64(Segment *t, const ProgTable64 *tp, FILE *inp)
 | 
|---|
 | 227 | +{
 | 
|---|
 | 228 |         Elf64_Phdr *p, *q;
 | 
|---|
 | 229 | -       unsigned x;
 | 
|---|
 | 230 | +       unsigned int x;
 | 
|---|
 | 231 |         unsigned long long off, len;
 | 
|---|
 | 232 |  
 | 
|---|
 | 233 |         p = 0;
 | 
|---|
 | 234 | @@ -547,7 +577,8 @@
 | 
|---|
 | 235 |         }
 | 
|---|
 | 236 |  }
 | 
|---|
 | 237 |  
 | 
|---|
 | 238 | -void store_image(Segment *t, FILE *out) {
 | 
|---|
 | 239 | +void store_image(Segment *t, FILE *out)
 | 
|---|
 | 240 | +{
 | 
|---|
 | 241 |         Exec ohdb;
 | 
|---|
 | 242 |  
 | 
|---|
 | 243 |         if (prog.swab) {
 | 
|---|
 | 244 | @@ -585,13 +616,15 @@
 | 
|---|
 | 245 |         return;
 | 
|---|
 | 246 |  }
 | 
|---|
 | 247 |  
 | 
|---|
 | 248 | -void Usage(){
 | 
|---|
 | 249 | +void Usage()
 | 
|---|
 | 250 | +{
 | 
|---|
 | 251 |         if (prog.version) Version();
 | 
|---|
 | 252 |         fprintf(stderr, "Usage: elftoaout [-o output] [-c|-b] [-V] input\n");
 | 
|---|
 | 253 |         exit(1);
 | 
|---|
 | 254 |  }
 | 
|---|
 | 255 |  
 | 
|---|
 | 256 | -void Version(){
 | 
|---|
 | 257 | +void Version()
 | 
|---|
 | 258 | +{
 | 
|---|
 | 259 |         printf("elftoaout 2.3: ELF to a.out convertor for SPARC and SPARC64 bootstraps\n");
 | 
|---|
 | 260 |  }
 | 
|---|
 | 261 |  
 | 
|---|