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