From: Peter Johnson Date: Sat, 19 Jan 2008 08:30:21 +0000 (-0000) Subject: tools/xdf: Make 64-bit safe. X-Git-Tag: v0.7.0~30 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e1f577f6d264843e367d4fefda6e06cfe07b8867;p=yasm tools/xdf: Make 64-bit safe. svn path=/trunk/yasm/; revision=2027 --- diff --git a/tools/xdf/xdf.h b/tools/xdf/xdf.h index 8f13774b..6d5e3e79 100644 --- a/tools/xdf/xdf.h +++ b/tools/xdf/xdf.h @@ -18,10 +18,12 @@ #ifndef XDF_H_INCLUDED #define XDF_H_INCLUDED -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long long u64; +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; typedef enum { @@ -78,6 +80,7 @@ typedef struct { /* 16 bytes */ } FILE_HEADER; +#define FILE_HEADER_SIZE (4+4+4+4) typedef struct { /* 40 bytes */ @@ -94,6 +97,7 @@ typedef struct { /* 40 bytes */ } SECTION_HEADER; +#define SECTION_HEADER_SIZE (4+8+8+2+2+4+4+4+4) typedef struct { /* 16 bytes */ @@ -104,6 +108,7 @@ typedef struct { /* 16 bytes */ } SYMBOL_ENTRY; +#define SYMBOL_ENTRY_SIZE (4+4+4+4) typedef struct { /* 16 bytes */ diff --git a/tools/xdf/xdfdump.c b/tools/xdf/xdfdump.c index 15064c18..b61bf92a 100644 --- a/tools/xdf/xdfdump.c +++ b/tools/xdf/xdfdump.c @@ -39,6 +39,15 @@ print_file_header(const FILE_HEADER *filehead) printf("\tTotal Headers Size=%d\n", filehead->f_size); } +void +read_syment(SYMBOL_ENTRY *syment, FILE *f) +{ + fread(&syment->e_sect_idx, sizeof(syment->e_sect_idx), 1, f); + fread(&syment->e_sect_off, sizeof(syment->e_sect_off), 1, f); + fread(&syment->e_name_off, sizeof(syment->e_name_off), 1, f); + fread(&syment->e_flags, sizeof(syment->e_flags), 1, f); +} + const char * get_syment_name(const SYMBOL_ENTRY *syment, FILE *f) { @@ -56,8 +65,8 @@ get_sym_name(u32 idx, FILE *f, size_t symtab_off) { SYMBOL_ENTRY syment; long oldpos = ftell(f); - fseek(f, symtab_off+idx*sizeof(SYMBOL_ENTRY), SEEK_SET); - fread(&syment, sizeof(syment), 1, f); + fseek(f, symtab_off+idx*SYMBOL_ENTRY_SIZE, SEEK_SET); + read_syment(&syment, f); fseek(f, oldpos, SEEK_SET); return get_syment_name(&syment, f); } @@ -67,8 +76,8 @@ get_sect_name(u32 idx, FILE *f, size_t symtab_off, size_t secttab_off) { SECTION_HEADER secthead; long oldpos = ftell(f); - fseek(f, secttab_off+idx*sizeof(SECTION_HEADER), SEEK_SET); - fread(§head, sizeof(secthead), 1, f); + fseek(f, secttab_off+idx*SECTION_HEADER_SIZE, SEEK_SET); + fread(§head.s_name_idx, sizeof(secthead.s_name_idx), 1, f); fseek(f, oldpos, SEEK_SET); return get_sym_name(secthead.s_name_idx, f, symtab_off); } @@ -88,7 +97,7 @@ print_symbol(const SYMBOL_ENTRY *syment, FILE *f, size_t symtab_off, if (first>0) printf("None"); printf(" Name=`%s' Section=", get_syment_name(syment, f)); - if ((long)syment->e_sect_idx < 0) + if (syment->e_sect_idx >= 0x80000000) printf("%d\n", syment->e_sect_idx); else printf("`%s' (%d)\n", @@ -201,7 +210,10 @@ main(int argc, char **argv) return EXIT_FAILURE; } - fread(&filehead, sizeof(filehead), 1, f); + fread(&filehead.f_magic, sizeof(filehead.f_magic), 1, f); + fread(&filehead.f_nsect, sizeof(filehead.f_nsect), 1, f); + fread(&filehead.f_nsyms, sizeof(filehead.f_nsyms), 1, f); + fread(&filehead.f_size, sizeof(filehead.f_size), 1, f); if (filehead.f_magic != XDF_MAGIC) { fprintf(stderr, "Magic number mismatch (expected %08X, got %08X\n", @@ -210,17 +222,25 @@ main(int argc, char **argv) } print_file_header(&filehead); - symtab_off = sizeof(FILE_HEADER)+filehead.f_nsect*sizeof(SECTION_HEADER); + symtab_off = FILE_HEADER_SIZE+filehead.f_nsect*SECTION_HEADER_SIZE; for (i=0; i