|
|
Patch adapted to rocklinux patching 2006-12-12 sk / ripclaw
Submitted By: Jim Gifford (patches at jg555 dot com) Date: 2006-01-03 Initial Package Version: 2.3 Origin: Dave Miller Upstream Status: Unknown Description: Fixes 64 Bit Issues with Elftoaout
http://marc.theaimsgroup.com/?l=linux-sparc&m=113617505627794&w=2 diff -Naur elftoaout-2.3.orig/elftoaout.c elftoaout-2.3/elftoaout.c
--- ./elftoaout.c.orig 2000-06-03 20:20:12.000000000 +0000
+++ ./elftoaout.c 2006-01-03 22:33:28.000000000 +0000
@@ -20,16 +20,36 @@
*/ #include <stdio.h> #include <stdlib.h> -#ifdef linux
#include <linux/elf.h> -#define ELFDATA2MSB 2
-#else
-#include <sys/elf.h>
-#endif
-
-#define swab16(x) (((x)<<8&0xFF00)|((x)>>8&0x00FF))
-#define swab32(x) (((x)<<24&0xFF000000)|((x)<<8&0x00FF0000)|((x)>>24&0x000000FF)|((x)>>8&0x0000FF00))
-#define swab64(x) ((((unsigned long long)(swab32((unsigned int)x))) << 32) | (swab32(((unsigned long long)x)>>32)))
+#include <sys/types.h>
+
+static inline u_int16_t swab16(u_int16_t x)
+{
+ return (((x << 8) & 0xFF00) |
+ ((x >> 8) & 0x00FF));
+}
+
+static inline u_int32_t swab32(u_int32_t x)
+{
+ return (((x << 24) & 0xFF000000) |
+ ((x << 8) & 0x00FF0000) |
+ ((x >> 24) & 0x000000FF) |
+ ((x >> 8) & 0x0000FF00));
+}
+
+static inline u_int64_t swab64(u_int64_t x)
+{
+ return ((u_int64_t)
+ ((u_int64_t)(((u_int64_t)x & (u_int64_t)0x00000000000000ffULL) << 56) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0x000000000000ff00ULL) << 40) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0x0000000000ff0000ULL) << 24) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0x00000000ff000000ULL) << 8) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0x000000ff00000000ULL) >> 8) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0x0000ff0000000000ULL) >> 24) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0x00ff000000000000ULL) >> 40) |
+ (u_int64_t)(((u_int64_t)x & (u_int64_t)0xff00000000000000ULL) >> 56)));
+}
+
/* We carry a.out header here in order to compile the thing on Solaris */ @@ -37,14 +57,14 @@
#define CMAGIC 0x01030108 typedef struct { - unsigned long a_magic; /* magic number */
- unsigned long a_text; /* size of text segment */
- unsigned long a_data; /* size of initialized data */
- unsigned long a_bss; /* size of uninitialized data */
- unsigned long a_syms; /* size of symbol table || checksum */
- unsigned long a_entry; /* entry point */
- unsigned long a_trsize; /* size of text relocation */
- unsigned long a_drsize; /* size of data relocation */
+ u_int32_t a_magic; /* magic number */
+ u_int32_t a_text; /* size of text segment */
+ u_int32_t a_data; /* size of initialized data */
+ u_int32_t a_bss; /* size of uninitialized data */
+ u_int32_t a_syms; /* size of symbol table || checksum */
+ u_int32_t a_entry; /* entry point */
+ u_int32_t a_trsize; /* size of text relocation */
+ u_int32_t a_drsize; /* size of data relocation */
} Exec; @@ -56,17 +76,16 @@
int swab; int sparc64; int csum; - /* friend void Usage(void); */
} Application; typedef struct { Elf32_Phdr *tab; - unsigned len;
+ unsigned int len;
} ProgTable; typedef struct { Elf64_Phdr *tab; - unsigned len;
+ unsigned int len;
} ProgTable64; void get_ptab(ProgTable *t, FILE *inp, const Elf32_Ehdr *h); @@ -75,9 +94,9 @@
void print_ptab64(ProgTable64 *t); typedef struct { - char *buf; /* Image data */
- unsigned len; /* Length of buffer */
- unsigned bss; /* Length of extra data */
+ unsigned char *buf; /* Image data */
+ unsigned int len; /* Length of buffer */
+ unsigned int bss; /* Length of extra data */
} Segment; void load_image(Segment *t, const ProgTable *h, FILE *inp); @@ -105,7 +124,8 @@
parse_args(&prog, argc, argv); - if (prog.version) Version();
+ if (prog.version)
+ Version();
if (freopen(prog.iname, "r", stdin) == NULL) { fprintf(stderr, "Cannot open \"%s\"\n", prog.iname); @@ -141,7 +161,8 @@
exit(0); } -void parse_args( Application *t, unsigned argc, const char **argv ){
+void parse_args( Application *t, unsigned argc, const char **argv )
+{
const char *arg; union { char c[4]; @@ -185,8 +206,8 @@
if (t->csum && t->sun4_mode) Usage (); /* Checksum lives in header. */ } -void get_header(Elf32_Ehdr *t, FILE *inp) {
-
+void get_header(Elf32_Ehdr *t, FILE *inp)
+{
if (fread((void*) t, sizeof(Elf64_Ehdr), 1, inp) != 1) { fprintf(stderr, "Read error on header\n"); exit(1); @@ -249,8 +270,9 @@
} } -void get_ptab(ProgTable *t, FILE *inp, const Elf32_Ehdr *h) {
- unsigned x;
+void get_ptab(ProgTable *t, FILE *inp, const Elf32_Ehdr *h)
+{
+ unsigned int x;
/** fprintf(stderr, "Program header table off = 0x%x\n", (unsigned) h->e_phoff); **/ @@ -294,8 +316,9 @@
} } -void get_ptab64(ProgTable64 *t, FILE *inp, const Elf64_Ehdr *h) {
- unsigned x;
+void get_ptab64(ProgTable64 *t, FILE *inp, const Elf64_Ehdr *h)
+{
+ unsigned int x;
if (h->e_phoff == 0) { fprintf(stderr, "No Program Header Table\n"); @@ -332,8 +355,9 @@
} } -void print_ptab(ProgTable *t) {
- unsigned x;
+void print_ptab(ProgTable *t)
+{
+ unsigned int x;
const Elf32_Phdr *p; for (x = 0; x < t->len; x++) { @@ -374,8 +398,9 @@
} } -void print_ptab64(ProgTable64 *t) {
- unsigned x;
+void print_ptab64(ProgTable64 *t)
+{
+ unsigned int x;
const Elf64_Phdr *p; for (x = 0; x < t->len; x++) { @@ -387,8 +412,11 @@
break; case PT_LOAD: printf("Loadable to 0x%Lx[0x%Lx] from 0x%Lx[0x%Lx] align 0x%Lx", - p->p_vaddr, p->p_memsz, p->p_offset, p->p_filesz,
- p->p_align);
+ (unsigned long long) p->p_vaddr,
+ (unsigned long long) p->p_memsz,
+ (unsigned long long) p->p_offset,
+ (unsigned long long) p->p_filesz,
+ (unsigned long long) p->p_align);
break; case PT_DYNAMIC: printf("Dynamic"); @@ -416,9 +444,10 @@
} } -void load_image(Segment *t, const ProgTable *tp, FILE *inp) {
+void load_image(Segment *t, const ProgTable *tp, FILE *inp)
+{
Elf32_Phdr *p, *q; - unsigned x;
+ unsigned int x;
unsigned long off, len; p = 0; @@ -484,9 +513,10 @@
} } -void load_image64(Segment *t, const ProgTable64 *tp, FILE *inp) {
+void load_image64(Segment *t, const ProgTable64 *tp, FILE *inp)
+{
Elf64_Phdr *p, *q; - unsigned x;
+ unsigned int x;
unsigned long long off, len; p = 0; @@ -547,7 +577,8 @@
} } -void store_image(Segment *t, FILE *out) {
+void store_image(Segment *t, FILE *out)
+{
Exec ohdb; if (prog.swab) { @@ -585,13 +616,15 @@
return; } -void Usage(){
+void Usage()
+{
if (prog.version) Version(); fprintf(stderr, "Usage: elftoaout [-o output] [-c|-b] [-V] input\n"); exit(1); } -void Version(){
+void Version()
+{
printf("elftoaout 2.3: ELF to a.out convertor for SPARC and SPARC64 bootstraps\n"); }
|