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) {
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) {
211 addr, 0, string_symbols + str_index, 0, -1);
215 free(string_symbols);
221 *entrypointp = (int32_t)entry;
228 n_executables_loaded ++;