OLD | NEW |
1 // Inferno utils/8l/asm.c | 1 // Inferno utils/8l/asm.c |
2 // http://code.google.com/p/inferno-os/source/browse/utils/8l/asm.c | 2 // http://code.google.com/p/inferno-os/source/browse/utils/8l/asm.c |
3 // | 3 // |
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. | 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. |
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) | 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) |
6 // Portions Copyright © 1997-1999 Vita Nuova Limited | 6 // Portions Copyright © 1997-1999 Vita Nuova Limited |
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) | 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) |
8 // Portions Copyright © 2004,2006 Bruce Ellis | 8 // Portions Copyright © 2004,2006 Bruce Ellis |
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) | 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) |
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others | 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 } | 268 } |
269 return 0; | 269 return 0; |
270 } | 270 } |
271 | 271 |
272 void | 272 void |
273 doelf(void) | 273 doelf(void) |
274 { | 274 { |
275 Sym *s, *shstrtab, *dynamic, *dynstr, *d; | 275 Sym *s, *shstrtab, *dynamic, *dynstr, *d; |
276 int h, nsym, t; | 276 int h, nsym, t; |
277 | 277 |
278 » if(HEADTYPE != 7 && HEADTYPE != 8 && HEADTYPE != 9) | 278 » if(!iself) |
279 return; | 279 return; |
280 | 280 |
281 /* predefine strings we need for section headers */ | 281 /* predefine strings we need for section headers */ |
282 shstrtab = lookup(".shstrtab", 0); | 282 shstrtab = lookup(".shstrtab", 0); |
283 shstrtab->reachable = 1; | 283 shstrtab->reachable = 1; |
284 elfstr[ElfStrEmpty] = addstring(shstrtab, ""); | 284 elfstr[ElfStrEmpty] = addstring(shstrtab, ""); |
285 elfstr[ElfStrText] = addstring(shstrtab, ".text"); | 285 elfstr[ElfStrText] = addstring(shstrtab, ".text"); |
286 elfstr[ElfStrData] = addstring(shstrtab, ".data"); | 286 elfstr[ElfStrData] = addstring(shstrtab, ".data"); |
287 elfstr[ElfStrBss] = addstring(shstrtab, ".bss"); | 287 elfstr[ElfStrBss] = addstring(shstrtab, ".bss"); |
288 if(!debug['s']) { | 288 if(!debug['s']) { |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 if(HEADTYPE == 8) { | 497 if(HEADTYPE == 8) { |
498 while(pc < INITDAT) { | 498 while(pc < INITDAT) { |
499 cput(0xf4); // hlt | 499 cput(0xf4); // hlt |
500 pc++; | 500 pc++; |
501 } | 501 } |
502 } | 502 } |
503 cflush(); | 503 cflush(); |
504 | 504 |
505 switch(HEADTYPE) { | 505 switch(HEADTYPE) { |
506 default: | 506 default: |
| 507 if(iself) |
| 508 goto Elfseek; |
507 diag("unknown header type %d", HEADTYPE); | 509 diag("unknown header type %d", HEADTYPE); |
508 case 0: | 510 case 0: |
509 seek(cout, rnd(HEADR+textsize, 8192), 0); | 511 seek(cout, rnd(HEADR+textsize, 8192), 0); |
510 break; | 512 break; |
511 case 1: | 513 case 1: |
512 textsize = rnd(HEADR+textsize, 4096)-HEADR; | 514 textsize = rnd(HEADR+textsize, 4096)-HEADR; |
513 seek(cout, textsize+HEADR, 0); | 515 seek(cout, textsize+HEADR, 0); |
514 break; | 516 break; |
515 case 2: | 517 case 2: |
516 seek(cout, HEADR+textsize, 0); | 518 seek(cout, HEADR+textsize, 0); |
517 break; | 519 break; |
518 case 3: | 520 case 3: |
519 case 4: | 521 case 4: |
520 seek(cout, HEADR+rnd(textsize, INITRND), 0); | 522 seek(cout, HEADR+rnd(textsize, INITRND), 0); |
521 break; | 523 break; |
522 case 6: | 524 case 6: |
523 v = HEADR+textsize; | 525 v = HEADR+textsize; |
524 seek(cout, v, 0); | 526 seek(cout, v, 0); |
525 v = rnd(v, 4096) - v; | 527 v = rnd(v, 4096) - v; |
526 while(v > 0) { | 528 while(v > 0) { |
527 cput(0); | 529 cput(0); |
528 v--; | 530 v--; |
529 } | 531 } |
530 cflush(); | 532 cflush(); |
531 break; | 533 break; |
532 » case 7: | 534 » Elfseek: |
533 » case 8: | |
534 » case 9: | |
535 case 10: | 535 case 10: |
536 v = rnd(HEADR+textsize, INITRND); | 536 v = rnd(HEADR+textsize, INITRND); |
537 seek(cout, v, 0); | 537 seek(cout, v, 0); |
538 break; | 538 break; |
539 } | 539 } |
540 | 540 |
541 if(debug['v']) | 541 if(debug['v']) |
542 Bprint(&bso, "%5.2f datblk\n", cputime()); | 542 Bprint(&bso, "%5.2f datblk\n", cputime()); |
543 Bflush(&bso); | 543 Bflush(&bso); |
544 | 544 |
(...skipping 18 matching lines...) Expand all Loading... |
563 symsize = 0; | 563 symsize = 0; |
564 spsize = 0; | 564 spsize = 0; |
565 lcsize = 0; | 565 lcsize = 0; |
566 symo = 0; | 566 symo = 0; |
567 if(!debug['s']) { | 567 if(!debug['s']) { |
568 if(debug['v']) | 568 if(debug['v']) |
569 Bprint(&bso, "%5.2f sym\n", cputime()); | 569 Bprint(&bso, "%5.2f sym\n", cputime()); |
570 Bflush(&bso); | 570 Bflush(&bso); |
571 switch(HEADTYPE) { | 571 switch(HEADTYPE) { |
572 default: | 572 default: |
| 573 if(iself) |
| 574 goto Elfsym; |
573 case 0: | 575 case 0: |
574 seek(cout, rnd(HEADR+textsize, 8192)+datsize, 0); | 576 seek(cout, rnd(HEADR+textsize, 8192)+datsize, 0); |
575 break; | 577 break; |
576 case 1: | 578 case 1: |
577 seek(cout, rnd(HEADR+textsize, INITRND)+datsize, 0); | 579 seek(cout, rnd(HEADR+textsize, INITRND)+datsize, 0); |
578 break; | 580 break; |
579 case 2: | 581 case 2: |
580 seek(cout, HEADR+textsize+datsize, 0); | 582 seek(cout, HEADR+textsize+datsize, 0); |
581 break; | 583 break; |
582 case 3: | 584 case 3: |
583 case 4: | 585 case 4: |
584 debug['s'] = 1; | 586 debug['s'] = 1; |
585 symo = HEADR+textsize+datsize; | 587 symo = HEADR+textsize+datsize; |
586 break; | 588 break; |
587 case 6: | 589 case 6: |
588 symo = rnd(HEADR+textsize, INITRND)+rnd(datsize, INITRND
)+machlink; | 590 symo = rnd(HEADR+textsize, INITRND)+rnd(datsize, INITRND
)+machlink; |
589 break; | 591 break; |
590 » » case 7: | 592 » » Elfsym: |
591 » » case 8: | |
592 » » case 9: | |
593 case 10: | 593 case 10: |
594 symo = rnd(HEADR+textsize, INITRND)+datsize; | 594 symo = rnd(HEADR+textsize, INITRND)+datsize; |
595 symo = rnd(symo, INITRND); | 595 symo = rnd(symo, INITRND); |
596 break; | 596 break; |
597 } | 597 } |
598 seek(cout, symo+8, 0); | 598 seek(cout, symo+8, 0); |
599 if(!debug['s']) | 599 if(!debug['s']) |
600 asmsym(); | 600 asmsym(); |
601 if(debug['v']) | 601 if(debug['v']) |
602 Bprint(&bso, "%5.2f sp\n", cputime()); | 602 Bprint(&bso, "%5.2f sp\n", cputime()); |
(...skipping 17 matching lines...) Expand all Loading... |
620 seek(cout, HEADR+textsize+datsize, 0); | 620 seek(cout, HEADR+textsize+datsize, 0); |
621 asmdyn(); | 621 asmdyn(); |
622 cflush(); | 622 cflush(); |
623 } | 623 } |
624 if(debug['v']) | 624 if(debug['v']) |
625 Bprint(&bso, "%5.2f headr\n", cputime()); | 625 Bprint(&bso, "%5.2f headr\n", cputime()); |
626 Bflush(&bso); | 626 Bflush(&bso); |
627 seek(cout, 0L, 0); | 627 seek(cout, 0L, 0); |
628 switch(HEADTYPE) { | 628 switch(HEADTYPE) { |
629 default: | 629 default: |
| 630 if(iself) |
| 631 goto Elfput; |
630 case 0: /* garbage */ | 632 case 0: /* garbage */ |
631 lput(0x160L<<16); /* magic and sections */ | 633 lput(0x160L<<16); /* magic and sections */ |
632 lput(0L); /* time and date */ | 634 lput(0L); /* time and date */ |
633 lput(rnd(HEADR+textsize, 4096)+datsize); | 635 lput(rnd(HEADR+textsize, 4096)+datsize); |
634 lput(symsize); /* nsyms */ | 636 lput(symsize); /* nsyms */ |
635 lput((0x38L<<16)|7L); /* size of optional hdr and flag
s */ | 637 lput((0x38L<<16)|7L); /* size of optional hdr and flag
s */ |
636 lput((0413<<16)|0437L); /* magic and version */ | 638 lput((0413<<16)|0437L); /* magic and version */ |
637 lput(rnd(HEADR+textsize, 4096)); /* sizes */ | 639 lput(rnd(HEADR+textsize, 4096)); /* sizes */ |
638 lput(datsize); | 640 lput(datsize); |
639 lput(bsssize); | 641 lput(bsssize); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 wputl(0x0000); | 755 wputl(0x0000); |
754 wputl(0x0000); | 756 wputl(0x0000); |
755 wputl(0x003E); /* reloc table offset */ | 757 wputl(0x003E); /* reloc table offset */ |
756 wputl(0x0000); /* overlay number */ | 758 wputl(0x0000); /* overlay number */ |
757 break; | 759 break; |
758 | 760 |
759 case 6: | 761 case 6: |
760 asmbmacho(symdatva, symo); | 762 asmbmacho(symdatva, symo); |
761 break; | 763 break; |
762 | 764 |
763 » case 7: | 765 » Elfput: |
764 » case 8: | |
765 » case 9: | |
766 /* elf 386 */ | 766 /* elf 386 */ |
767 » » if(HEADTYPE == 8) | 767 » » if(HEADTYPE == 8 || HEADTYPE == 11) |
768 debug['d'] = 1; | 768 debug['d'] = 1; |
769 | 769 |
770 eh = getElfEhdr(); | 770 eh = getElfEhdr(); |
771 fo = HEADR; | 771 fo = HEADR; |
772 startva = INITTEXT - HEADR; | 772 startva = INITTEXT - HEADR; |
773 va = startva + fo; | 773 va = startva + fo; |
774 w = textsize; | 774 w = textsize; |
775 | 775 |
776 /* This null SHdr must appear before all others */ | 776 /* This null SHdr must appear before all others */ |
777 sh = newElfShdr(elfstr[ElfStrEmpty]); | 777 sh = newElfShdr(elfstr[ElfStrEmpty]); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 ph = newElfPhdr(); | 826 ph = newElfPhdr(); |
827 ph->type = PT_LOAD; | 827 ph->type = PT_LOAD; |
828 ph->flags = PF_W+PF_R; | 828 ph->flags = PF_W+PF_R; |
829 ph->off = fo; | 829 ph->off = fo; |
830 ph->vaddr = va; | 830 ph->vaddr = va; |
831 ph->paddr = va; | 831 ph->paddr = va; |
832 ph->filesz = w; | 832 ph->filesz = w; |
833 ph->memsz = w+bsssize; | 833 ph->memsz = w+bsssize; |
834 ph->align = INITRND; | 834 ph->align = INITRND; |
835 | 835 |
836 » » if(!debug['s'] && HEADTYPE != 8) { | 836 » » if(!debug['s'] && HEADTYPE != 8 && HEADTYPE != 11) { |
837 ph = newElfPhdr(); | 837 ph = newElfPhdr(); |
838 ph->type = PT_LOAD; | 838 ph->type = PT_LOAD; |
839 ph->flags = PF_W+PF_R; | 839 ph->flags = PF_W+PF_R; |
840 ph->off = symo; | 840 ph->off = symo; |
841 ph->vaddr = symdatva; | 841 ph->vaddr = symdatva; |
842 ph->paddr = symdatva; | 842 ph->paddr = symdatva; |
843 ph->filesz = 8+symsize+lcsize; | 843 ph->filesz = 8+symsize+lcsize; |
844 ph->memsz = 8+symsize+lcsize; | 844 ph->memsz = 8+symsize+lcsize; |
845 ph->align = INITRND; | 845 ph->align = INITRND; |
846 } | 846 } |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1267 | 1267 |
1268 if(r <= 0) | 1268 if(r <= 0) |
1269 return v; | 1269 return v; |
1270 v += r - 1; | 1270 v += r - 1; |
1271 c = v % r; | 1271 c = v % r; |
1272 if(c < 0) | 1272 if(c < 0) |
1273 c += r; | 1273 c += r; |
1274 v -= c; | 1274 v -= c; |
1275 return v; | 1275 return v; |
1276 } | 1276 } |
OLD | NEW |