5 #define PADDR(a) ((ulong)(a) & ~0xF0000000)
14 if(*a >= '0' && *a <= '9')
24 return s->value+INITDAT;
26 diag("entry not text: %s", s->name);
64 strnput(char *s, int n)
66 for(; *s && n > 0; s++){
85 Bprint(&bso, "%5.2f asmb\n", cputime());
91 for(p = firstp; p != P; p = p->link) {
97 diag("phase error %lux sb %lux in %s", p->pc, pc, TNAME);
102 if(cbc < sizeof(and))
106 Bprint(&bso, pcstr, pc);
107 for(op1 = and; op1 < andptr; op1++)
108 Bprint(&bso, "%.2ux", *op1 & 0xff);
109 Bprint(&bso, "\t%P\n", curp);
114 else if(reloca != nil)
115 diag("reloc failure: %P", curp);
117 memmove(cbp, and, a);
125 diag("unknown header type %ld", HEADTYPE);
127 seek(cout, rnd(HEADR+textsize, 8192), 0);
130 textsize = rnd(HEADR+textsize, 4096)-HEADR;
131 seek(cout, textsize+HEADR, 0);
135 seek(cout, HEADR+textsize, 0);
139 seek(cout, HEADR+rnd(textsize, INITRND), 0);
144 Bprint(&bso, "%5.2f datblk\n", cputime());
150 write(cout, buf, INITDAT-textsize);
154 for(v = 0; v < datsize; v += sizeof(buf)-Dbufslop) {
155 if(datsize-v > sizeof(buf)-Dbufslop)
156 datblk(v, sizeof(buf)-Dbufslop);
158 datblk(v, datsize-v);
166 Bprint(&bso, "%5.2f sym\n", cputime());
171 seek(cout, rnd(HEADR+textsize, 8192)+datsize, 0);
174 seek(cout, rnd(HEADR+textsize, INITRND)+datsize, 0);
178 seek(cout, HEADR+textsize+datsize, 0);
188 Bprint(&bso, "%5.2f sp\n", cputime());
191 Bprint(&bso, "%5.2f pc\n", cputime());
200 seek(cout, HEADR+textsize+datsize, 0);
205 Bprint(&bso, "%5.2f headr\n", cputime());
210 case 0: /* garbage */
211 lput(0x160L<<16); /* magic and sections */
212 lput(0L); /* time and date */
213 lput(rnd(HEADR+textsize, 4096)+datsize);
214 lput(symsize); /* nsyms */
215 lput((0x38L<<16)|7L); /* size of optional hdr and flags */
216 lput((0413<<16)|0437L); /* magic and version */
217 lput(rnd(HEADR+textsize, 4096));/* sizes */
220 lput(entryvalue()); /* va of entry */
221 lput(INITTEXT-HEADR); /* va of base of text */
222 lput(INITDAT); /* va of base of data */
223 lput(INITDAT+datsize); /* va of base of bss */
224 lput(~0L); /* gp reg mask */
229 lput(~0L); /* gp value ?? */
231 case 1: /* unix coff */
235 lputl(0x0004014c); /* 4 sections, magic */
236 lputl(0); /* unix time stamp */
237 lputl(0); /* symbol table */
238 lputl(0); /* nsyms */
239 lputl(0x0003001c); /* flags, sizeof a.out header */
243 lputl(0x10b); /* magic, version stamp */
244 lputl(rnd(textsize, INITRND)); /* text sizes */
245 lputl(datsize); /* data sizes */
246 lputl(bsssize); /* bss sizes */
247 lput(entryvalue()); /* va of entry */
248 lputl(INITTEXT); /* text start */
249 lputl(INITDAT); /* data start */
251 * text section header
254 lputl(HEADR); /* pa */
255 lputl(HEADR); /* va */
256 lputl(textsize); /* text size */
257 lputl(HEADR); /* file offset */
258 lputl(0); /* relocation */
259 lputl(0); /* line numbers */
260 lputl(0); /* relocation, line numbers */
261 lputl(0x20); /* flags text only */
263 * data section header
266 lputl(INITDAT); /* pa */
267 lputl(INITDAT); /* va */
268 lputl(datsize); /* data size */
269 lputl(HEADR+textsize); /* file offset */
270 lputl(0); /* relocation */
271 lputl(0); /* line numbers */
272 lputl(0); /* relocation, line numbers */
273 lputl(0x40); /* flags data only */
278 lputl(INITDAT+datsize); /* pa */
279 lputl(INITDAT+datsize); /* va */
280 lputl(bsssize); /* bss size */
281 lputl(0); /* file offset */
282 lputl(0); /* relocation */
283 lputl(0); /* line numbers */
284 lputl(0); /* relocation, line numbers */
285 lputl(0x80); /* flags bss only */
287 * comment section header
289 strnput(".comment", 8);
292 lputl(symsize+lcsize); /* comment size */
293 lputl(HEADR+textsize+datsize); /* file offset */
294 lputl(HEADR+textsize+datsize); /* offset of syms */
295 lputl(HEADR+textsize+datsize+symsize);/* offset of line numbers */
296 lputl(0); /* relocation, line numbers */
297 lputl(0x200); /* flags comment only */
303 lput(magic); /* magic */
304 lput(textsize); /* sizes */
307 lput(symsize); /* nsyms */
308 lput(entryvalue()); /* va of entry */
309 lput(spsize); /* sp offsets */
310 lput(lcsize); /* line offsets */
316 /* fake MS-DOS .EXE */
317 v = rnd(HEADR+textsize, INITRND)+datsize;
318 wputl(0x5A4D); /* 'MZ' */
319 wputl(v % 512); /* bytes in last page */
320 wputl(rnd(v, 512)/512); /* total number of pages */
321 wputl(0x0000); /* number of reloc items */
322 v = rnd(HEADR-(INITTEXT & 0xFFFF), 16);
323 wputl(v/16); /* size of header */
324 wputl(0x0000); /* minimum allocation */
325 wputl(0xFFFF); /* maximum allocation */
326 wputl(0x0000); /* initial ss value */
327 wputl(0x0100); /* initial sp value */
328 wputl(0x0000); /* complemented checksum */
330 wputl(v); /* initial ip value (!) */
331 wputl(0x0000); /* initial cs value */
334 wputl(0x003E); /* reloc table offset */
335 wputl(0x0000); /* overlay number */
338 strnput("\177ELF", 4); /* e_ident */
339 cput(1); /* class = 32 bit */
340 cput(1); /* data = LSB */
341 cput(1); /* version = CURRENT */
343 wputl(2); /* type = EXEC */
344 wputl(3); /* machine = 386 */
345 lputl(1L); /* version = CURRENT */
346 lputl(PADDR(entryvalue())); /* entry vaddr */
347 lputl(52L); /* offset to first phdr */
348 lputl(0L); /* offset to first shdr */
349 lputl(0L); /* flags = 386 */
350 wputl(52); /* Ehdr size */
351 wputl(32); /* Phdr size */
352 wputl(3); /* # of Phdrs */
353 wputl(0); /* Shdr size */
354 wputl(0); /* # of Shdrs */
355 wputl(0); /* Shdr string size */
357 lputl(1L); /* text - type = PT_LOAD */
358 lputl(HEADR); /* file offset */
359 lputl(INITTEXT); /* vaddr */
360 lputl(PADDR(INITTEXT)); /* paddr */
361 lputl(textsize); /* file size */
362 lputl(textsize); /* memory size */
363 lputl(0x05L); /* protections = RX */
364 lputl(INITRND); /* alignment */
366 lputl(1L); /* data - type = PT_LOAD */
367 lputl(HEADR+textsize); /* file offset */
368 lputl(INITDAT); /* vaddr */
369 lputl(PADDR(INITDAT)); /* paddr */
370 lputl(datsize); /* file size */
371 lputl(datsize+bsssize); /* memory size */
372 lputl(0x06L); /* protections = RW */
373 lputl(INITRND); /* alignment */
375 lputl(0L); /* data - type = PT_NULL */
376 lputl(HEADR+textsize+datsize); /* file offset */
379 lputl(symsize); /* symbol table size */
380 lputl(lcsize); /* line number size */
381 lputl(0x04L); /* protections = R */
382 lputl(0x04L); /* alignment */
393 n = sizeof(buf.cbuf) - cbc;
395 write(cout, buf.cbuf, n);
397 cbc = sizeof(buf.cbuf);
401 datblk(long s, long n)
408 memset(buf.dbuf, 0, n+Dbufslop);
409 for(p = datap; p != P; p = p->link) {
411 l = p->from.sym->value + p->from.offset - s;
424 if(p->as != AINIT && p->as != ADYNT) {
425 for(j=l+(c-i)-1; j>=l; j--)
428 diag("multiple initialization");
437 fl = ieeedtof(&p->to.ieee);
439 if(debug['a'] && i == 0) {
440 Bprint(&bso, pcstr, l+s+INITDAT);
442 Bprint(&bso, "%.2ux", cast[fnuxi4[j]] & 0xff);
443 Bprint(&bso, "\t%P\n", curp);
446 buf.dbuf[l] = cast[fnuxi4[i]];
451 cast = (char*)&p->to.ieee;
452 if(debug['a'] && i == 0) {
453 Bprint(&bso, pcstr, l+s+INITDAT);
455 Bprint(&bso, "%.2ux", cast[fnuxi8[j]] & 0xff);
456 Bprint(&bso, "\t%P\n", curp);
459 buf.dbuf[l] = cast[fnuxi8[i]];
467 if(debug['a'] && i == 0) {
468 Bprint(&bso, pcstr, l+s+INITDAT);
470 Bprint(&bso, "%.2ux", p->to.scon[j] & 0xff);
471 Bprint(&bso, "\t%P\n", curp);
474 buf.dbuf[l] = p->to.scon[i];
480 if(p->to.type == D_ADDR) {
481 if(p->to.index != D_STATIC && p->to.index != D_EXTERN)
482 diag("DADDR type%P", p);
484 if(p->to.sym->type == SUNDEF)
485 ckoff(p->to.sym, fl);
486 fl += p->to.sym->value;
487 if(p->to.sym->type != STEXT && p->to.sym->type != SUNDEF)
490 dynreloc(p->to.sym, l+s+INITDAT, 1);
496 diag("bad nuxi %d %d\n%P", c, i, curp);
499 if(debug['a'] && i == 0) {
500 Bprint(&bso, pcstr, l+s+INITDAT);
502 Bprint(&bso, "%.2ux", cast[inuxi1[j]] & 0xff);
503 Bprint(&bso, "\t%P\n", curp);
506 buf.dbuf[l] = cast[inuxi1[i]];
511 if(debug['a'] && i == 0) {
512 Bprint(&bso, pcstr, l+s+INITDAT);
514 Bprint(&bso, "%.2ux", cast[inuxi2[j]] & 0xff);
515 Bprint(&bso, "\t%P\n", curp);
518 buf.dbuf[l] = cast[inuxi2[i]];
523 if(debug['a'] && i == 0) {
524 Bprint(&bso, pcstr, l+s+INITDAT);
526 Bprint(&bso, "%.2ux", cast[inuxi4[j]] & 0xff);
527 Bprint(&bso, "\t%P\n", curp);
530 buf.dbuf[l] = cast[inuxi4[i]];
538 write(cout, buf.dbuf, n);