| [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 |  | 
|---|