diff options
author | Peter Johnson <peter@tortall.net> | 2008-01-19 08:30:21 +0000 |
---|---|---|
committer | Peter Johnson <peter@tortall.net> | 2008-01-19 08:30:21 +0000 |
commit | e1f577f6d264843e367d4fefda6e06cfe07b8867 (patch) | |
tree | fcf32ff3b93949b1aa5f9d501d8bd4028d3fab86 /tools | |
parent | 0e0d4b413a0aefbdb7b231651e3c3baa2b1a04bb (diff) | |
download | yasm-e1f577f6d264843e367d4fefda6e06cfe07b8867.tar.gz |
tools/xdf: Make 64-bit safe.
svn path=/trunk/yasm/; revision=2027
Diffstat (limited to 'tools')
-rw-r--r-- | tools/xdf/xdf.h | 13 | ||||
-rw-r--r-- | tools/xdf/xdfdump.c | 38 |
2 files changed, 38 insertions, 13 deletions
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 <stdint.h> + +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<filehead.f_nsect; i++) { SECTION_HEADER secthead; - fread(§head, sizeof(secthead), 1, f); + fread(§head.s_name_idx, sizeof(secthead.s_name_idx), 1, f); + fread(§head.s_addr, sizeof(secthead.s_addr), 1, f); + fread(§head.s_vaddr, sizeof(secthead.s_vaddr), 1, f); + fread(§head.s_align, sizeof(secthead.s_align), 1, f); + fread(§head.s_flags, sizeof(secthead.s_flags), 1, f); + fread(§head.s_data_off, sizeof(secthead.s_data_off), 1, f); + fread(§head.s_data_size, sizeof(secthead.s_data_size), 1, f); + fread(§head.s_reltab_off, sizeof(secthead.s_reltab_off), 1, f); + fread(§head.s_num_reloc, sizeof(secthead.s_num_reloc), 1, f); print_section(§head, f, symtab_off); } printf("Symbol Table:\n"); for (i=0; i<filehead.f_nsyms; i++) { SYMBOL_ENTRY syment; - fread(&syment, sizeof(syment), 1, f); + read_syment(&syment, f); print_symbol(&syment, f, symtab_off, sizeof(FILE_HEADER)); } |