diff options
| author | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
| commit | d67b7dad77bb8aa973dad1f7c3ab0c309b114278 (patch) | |
| tree | 6794120fb327d6de19cf05eed53f80d877781a3e /utils/ql/asm.c | |
| parent | 09da2e137d5eb0c940df35d989e4c31ec0654fc4 (diff) | |
20100427-1251
Diffstat (limited to 'utils/ql/asm.c')
| -rw-r--r-- | utils/ql/asm.c | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/utils/ql/asm.c b/utils/ql/asm.c index 0c546ee3..25d4c772 100644 --- a/utils/ql/asm.c +++ b/utils/ql/asm.c @@ -299,11 +299,21 @@ asmb(void) lput(1L); /* version = CURRENT */ lput(entryvalue() & ~KMASK); /* entry vaddr */ lput(52L); /* offset to first phdr */ - lput(0L); /* offset to first shdr */ - lput(0L); /* flags = PPC */ - lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/ - lput((3L<<16)|0L); /* # Phdrs & Shdr size */ - lput((0L<<16)|0L); /* # Shdrs & shdr string size */ + + if(debug['S']){ + lput(HEADR+textsize+datsize+symsize); /* offset to first shdr */ + lput(0L); /* flags = PPC */ + lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/ + lput((3L<<16)|40L); /* # Phdrs & Shdr size */ + lput((3L<<16)|2L); /* # Shdrs & shdr string size */ + } + else{ + lput(0L); + lput(0L); /* flags = PPC */ + lput((52L<<16)|32L); /* Ehdr & Phdr sizes*/ + lput((3L<<16)|0L); /* # Phdrs & Shdr size */ + lput((3L<<16)|0L); /* # Shdrs & shdr string size */ + } lput(1L); /* text - type = PT_LOAD */ lput(HEADR); /* file offset */ @@ -331,6 +341,56 @@ asmb(void) lput(lcsize); /* line number size */ lput(0x04L); /* protections = R */ lput(0x04L); /* alignment code?? */ + cflush(); + + if(!debug['S']) + break; + + seek(cout, HEADR+textsize+datsize+symsize, 0); + lput(1); /* Section name (string tbl index) */ + lput(1); /* Section type */ + lput(2|4); /* Section flags */ + lput(INITTEXT & ~KMASK); /* Section virtual addr at execution */ + lput(HEADR); /* Section file offset */ + lput(textsize); /* Section size in bytes */ + lput(0); /* Link to another section */ + lput(0); /* Additional section information */ + lput(0x10000L); /* Section alignment */ + lput(0); /* Entry size if section holds table */ + + lput(7); /* Section name (string tbl index) */ + lput(1); /* Section type */ + lput(2|1); /* Section flags */ + lput(INITDAT & ~KMASK); /* Section virtual addr at execution */ + lput(HEADR+textsize); /* Section file offset */ + lput(datsize); /* Section size in bytes */ + lput(0); /* Link to another section */ + lput(0); /* Additional section information */ + lput(0x10000L); /* Section alignment */ + lput(0); /* Entry size if section holds table */ + + /* string section header */ + lput(12); /* Section name (string tbl index) */ + lput(3); /* Section type */ + lput(1 << 5); /* Section flags */ + lput(0); /* Section virtual addr at execution */ + lput(HEADR+textsize+datsize+symsize+3*40); /* Section file offset */ + lput(14); /* Section size in bytes */ + lput(0); /* Link to another section */ + lput(0); /* Additional section information */ + lput(1); /* Section alignment */ + lput(0); /* Entry size if section holds table */ + + /* string table */ + cput(0); + strnput(".text", 5); + cput(0); + strnput(".data", 5); + cput(0); + strnput(".strtab", 7); + cput(0); + cput(0); + break; } cflush(); |
