37 #define AOUT_FLAG_DECOSF1 1 38 #define AOUT_FLAG_FROM_BEGINNING 2 39 #define AOUT_FLAG_VADDR_ZERO_HACK 4 40 #define AOUT_FLAG_NO_SIZES 8 58 static void file_load_aout(
struct machine *m,
struct memory *mem,
59 char *filename,
int flags,
60 uint64_t *entrypointp,
int arch,
int *byte_orderp)
62 struct exec aout_header;
66 uint32_t entry, datasize, textsize;
68 uint32_t vaddr, total_len;
69 unsigned char buf[65536];
75 f = fopen(filename,
"r");
82 if (fread(&buf, 1, 32, f) != 32) {
86 vaddr = buf[16] + (buf[17] << 8) +
87 (buf[18] << 16) + ((uint64_t)buf[19] << 24);
88 entry = buf[20] + (buf[21] << 8) +
89 (buf[22] << 16) + ((uint64_t)buf[23] << 24);
90 debug(
"OSF1 a.out, load address 0x%08lx, " 91 "entry point 0x%08x\n", (
long)vaddr, (
long)entry);
93 fseek(f, 0, SEEK_END);
95 textsize = ftello(f) - 512;
97 fseek(f, 512, SEEK_SET);
99 fseek(f, 0, SEEK_END);
100 textsize = ftello(f) - 32;
103 fseek(f, 32, SEEK_SET);
105 len = fread(&aout_header, 1,
sizeof(aout_header), f);
106 if (len !=
sizeof(aout_header)) {
107 fprintf(stderr,
"%s: not a complete a.out image\n",
113 debug(
"a.out, entry point 0x%08lx\n", (
long)entry);
121 debug(
"text + data = %i + %i bytes\n", textsize, datasize);
127 fseek(f, 0, SEEK_SET);
132 total_len = textsize + datasize;
133 while (total_len != 0) {
134 len = total_len >
sizeof(buf) ?
sizeof(buf) : total_len;
135 len = fread(buf, 1, len, f);
142 uint64_t vaddr1 = vaddr &
144 uint64_t vaddr2 = (vaddr +
146 if (vaddr2 < vaddr1) {
154 if (flags & AOUT_FLAG_DECOSF1)
157 fprintf(stderr,
"could not read from %s," 158 " wanted to read %i bytes\n", filename,
172 uint32_t strings_len;
173 char *string_symbols;
176 debug(
"symbols: %i bytes @ 0x%x\n", symbsize, (
int)ftello(f));
178 len = fread(syms, 1, symbsize, f);
179 if (len != symbsize) {
180 fprintf(stderr,
"error reading symbols from %s\n",
186 fseek(f, 0, SEEK_END);
187 strings_len = ftello(f) - oldpos;
188 fseek(f, oldpos, SEEK_SET);
189 debug(
"strings: %i bytes @ 0x%x\n", strings_len,(
int)ftello(f));
191 if (fread(string_symbols, 1, strings_len, f) != strings_len) {
192 fprintf(stderr,
"Could not read symbols from %s?\n", filename);
197 aout_symbol_ptr = (
struct aout_symbol *) (
void*) syms;
200 while (i < n_symbols) {
203 unencode(type, &aout_symbol_ptr[i].type, uint32_t);
204 unencode(addr, &aout_symbol_ptr[i].addr, uint32_t);
209 if (type != 0 && addr != 0)
211 addr, 0, string_symbols + str_index, 0, -1);
215 free(string_symbols);
221 *entrypointp = (int32_t)entry;
228 n_executables_loaded ++;
#define AOUT_FLAG_NO_SIZES
#define AOUT_FLAG_DECOSF1
#define unencode(var, dataptr, typ)
void f(int s, int func, int only_name)
#define EMUL_LITTLE_ENDIAN
#define BITS_PER_MEMBLOCK
#define CHECK_ALLOCATION(ptr)
#define AOUT_FLAG_VADDR_ZERO_HACK
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
#define AOUT_FLAG_FROM_BEGINNING
void add_symbol_name(struct symbol_context *, uint64_t addr, uint64_t len, const char *name, int type, int n_args)
struct symbol_context symbol_context