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 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1072 } | 1072 } |
1073 sect->len = datsize - sect->vaddr; | 1073 sect->len = datsize - sect->vaddr; |
1074 | 1074 |
1075 /* we finished segdata, begin segtext */ | 1075 /* we finished segdata, begin segtext */ |
1076 | 1076 |
1077 /* read-only data */ | 1077 /* read-only data */ |
1078 sect = addsection(&segtext, ".rodata", 04); | 1078 sect = addsection(&segtext, ".rodata", 04); |
1079 sect->vaddr = 0; | 1079 sect->vaddr = 0; |
1080 datsize = 0; | 1080 datsize = 0; |
1081 s = datap; | 1081 s = datap; |
1082 » for(; s != nil && s->type < SGCDATA; s = s->next) { | 1082 » for(; s != nil && s->type < STYPELINK; s = s->next) { |
1083 if(s->align != 0) | 1083 if(s->align != 0) |
1084 datsize = rnd(datsize, s->align); | 1084 datsize = rnd(datsize, s->align); |
1085 s->type = SRODATA; | 1085 s->type = SRODATA; |
1086 s->value = datsize; | 1086 s->value = datsize; |
1087 datsize += rnd(s->size, PtrSize); | 1087 datsize += rnd(s->size, PtrSize); |
1088 } | 1088 } |
1089 sect->len = datsize - sect->vaddr; | 1089 sect->len = datsize - sect->vaddr; |
1090 datsize = rnd(datsize, PtrSize); | 1090 datsize = rnd(datsize, PtrSize); |
1091 | 1091 |
| 1092 /* type */ |
| 1093 sect = addsection(&segtext, ".typelink", 04); |
| 1094 sect->vaddr = datsize; |
| 1095 for(; s != nil && s->type == STYPELINK; s = s->next) { |
| 1096 s->type = SRODATA; |
| 1097 s->value = datsize; |
| 1098 datsize += s->size; |
| 1099 } |
| 1100 sect->len = datsize - sect->vaddr; |
| 1101 datsize = rnd(datsize, PtrSize); |
| 1102 ········ |
1092 /* gcdata */ | 1103 /* gcdata */ |
1093 sect = addsection(&segtext, ".gcdata", 04); | 1104 sect = addsection(&segtext, ".gcdata", 04); |
1094 sect->vaddr = datsize; | 1105 sect->vaddr = datsize; |
1095 for(; s != nil && s->type == SGCDATA; s = s->next) { | 1106 for(; s != nil && s->type == SGCDATA; s = s->next) { |
1096 s->type = SRODATA; | 1107 s->type = SRODATA; |
1097 s->value = datsize; | 1108 s->value = datsize; |
1098 datsize += s->size; | 1109 datsize += s->size; |
1099 } | 1110 } |
1100 sect->len = datsize - sect->vaddr; | 1111 sect->len = datsize - sect->vaddr; |
1101 datsize = rnd(datsize, PtrSize); | 1112 datsize = rnd(datsize, PtrSize); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 va = rnd(va, 128); | 1198 va = rnd(va, 128); |
1188 | 1199 |
1189 sect->len = va - sect->vaddr; | 1200 sect->len = va - sect->vaddr; |
1190 } | 1201 } |
1191 | 1202 |
1192 // assign addresses | 1203 // assign addresses |
1193 void | 1204 void |
1194 address(void) | 1205 address(void) |
1195 { | 1206 { |
1196 Section *s, *text, *data, *rodata, *symtab, *pclntab, *noptr, *bss, *nop
trbss; | 1207 Section *s, *text, *data, *rodata, *symtab, *pclntab, *noptr, *bss, *nop
trbss; |
1197 » Section *gcdata, *gcbss; | 1208 » Section *gcdata, *gcbss, *typelink; |
1198 Sym *sym, *sub; | 1209 Sym *sym, *sub; |
1199 uvlong va; | 1210 uvlong va; |
1200 | 1211 |
1201 va = INITTEXT; | 1212 va = INITTEXT; |
1202 segtext.rwx = 05; | 1213 segtext.rwx = 05; |
1203 segtext.vaddr = va; | 1214 segtext.vaddr = va; |
1204 segtext.fileoff = HEADR; | 1215 segtext.fileoff = HEADR; |
1205 for(s=segtext.sect; s != nil; s=s->next) { | 1216 for(s=segtext.sect; s != nil; s=s->next) { |
1206 s->vaddr = va; | 1217 s->vaddr = va; |
1207 va += rnd(s->len, PtrSize); | 1218 va += rnd(s->len, PtrSize); |
(...skipping 26 matching lines...) Expand all Loading... |
1234 noptr = s; | 1245 noptr = s; |
1235 if(strcmp(s->name, ".bss") == 0) | 1246 if(strcmp(s->name, ".bss") == 0) |
1236 bss = s; | 1247 bss = s; |
1237 if(strcmp(s->name, ".noptrbss") == 0) | 1248 if(strcmp(s->name, ".noptrbss") == 0) |
1238 noptrbss = s; | 1249 noptrbss = s; |
1239 } | 1250 } |
1240 segdata.filelen -= bss->len + noptrbss->len; // deduct .bss | 1251 segdata.filelen -= bss->len + noptrbss->len; // deduct .bss |
1241 | 1252 |
1242 text = segtext.sect; | 1253 text = segtext.sect; |
1243 rodata = text->next; | 1254 rodata = text->next; |
1244 » gcdata = rodata->next; | 1255 » typelink = rodata->next; |
| 1256 » gcdata = typelink->next; |
1245 gcbss = gcdata->next; | 1257 gcbss = gcdata->next; |
1246 symtab = gcbss->next; | 1258 symtab = gcbss->next; |
1247 pclntab = symtab->next; | 1259 pclntab = symtab->next; |
1248 | 1260 |
1249 for(sym = datap; sym != nil; sym = sym->next) { | 1261 for(sym = datap; sym != nil; sym = sym->next) { |
1250 cursym = sym; | 1262 cursym = sym; |
1251 if(sym->type < SNOPTRDATA) | 1263 if(sym->type < SNOPTRDATA) |
1252 sym->value += rodata->vaddr; | 1264 sym->value += rodata->vaddr; |
1253 else | 1265 else |
1254 sym->value += segdata.sect->vaddr; | 1266 sym->value += segdata.sect->vaddr; |
1255 for(sub = sym->sub; sub != nil; sub = sub->sub) | 1267 for(sub = sym->sub; sub != nil; sub = sub->sub) |
1256 sub->value += sym->value; | 1268 sub->value += sym->value; |
1257 } | 1269 } |
1258 ········ | 1270 ········ |
1259 xdefine("text", STEXT, text->vaddr); | 1271 xdefine("text", STEXT, text->vaddr); |
1260 xdefine("etext", STEXT, text->vaddr + text->len); | 1272 xdefine("etext", STEXT, text->vaddr + text->len); |
1261 xdefine("rodata", SRODATA, rodata->vaddr); | 1273 xdefine("rodata", SRODATA, rodata->vaddr); |
1262 xdefine("erodata", SRODATA, rodata->vaddr + rodata->len); | 1274 xdefine("erodata", SRODATA, rodata->vaddr + rodata->len); |
| 1275 xdefine("typelink", SRODATA, typelink->vaddr); |
| 1276 xdefine("etypelink", SRODATA, typelink->vaddr + typelink->len); |
1263 xdefine("gcdata", SGCDATA, gcdata->vaddr); | 1277 xdefine("gcdata", SGCDATA, gcdata->vaddr); |
1264 xdefine("egcdata", SGCDATA, gcdata->vaddr + gcdata->len); | 1278 xdefine("egcdata", SGCDATA, gcdata->vaddr + gcdata->len); |
1265 xdefine("gcbss", SGCBSS, gcbss->vaddr); | 1279 xdefine("gcbss", SGCBSS, gcbss->vaddr); |
1266 xdefine("egcbss", SGCBSS, gcbss->vaddr + gcbss->len); | 1280 xdefine("egcbss", SGCBSS, gcbss->vaddr + gcbss->len); |
1267 xdefine("symtab", SRODATA, symtab->vaddr); | 1281 xdefine("symtab", SRODATA, symtab->vaddr); |
1268 xdefine("esymtab", SRODATA, symtab->vaddr + symtab->len); | 1282 xdefine("esymtab", SRODATA, symtab->vaddr + symtab->len); |
1269 xdefine("pclntab", SRODATA, pclntab->vaddr); | 1283 xdefine("pclntab", SRODATA, pclntab->vaddr); |
1270 xdefine("epclntab", SRODATA, pclntab->vaddr + pclntab->len); | 1284 xdefine("epclntab", SRODATA, pclntab->vaddr + pclntab->len); |
1271 xdefine("noptrdata", SNOPTRDATA, noptr->vaddr); | 1285 xdefine("noptrdata", SNOPTRDATA, noptr->vaddr); |
1272 xdefine("enoptrdata", SNOPTRDATA, noptr->vaddr + noptr->len); | 1286 xdefine("enoptrdata", SNOPTRDATA, noptr->vaddr + noptr->len); |
1273 xdefine("bss", SBSS, bss->vaddr); | 1287 xdefine("bss", SBSS, bss->vaddr); |
1274 xdefine("ebss", SBSS, bss->vaddr + bss->len); | 1288 xdefine("ebss", SBSS, bss->vaddr + bss->len); |
1275 xdefine("data", SDATA, data->vaddr); | 1289 xdefine("data", SDATA, data->vaddr); |
1276 xdefine("edata", SDATA, data->vaddr + data->len); | 1290 xdefine("edata", SDATA, data->vaddr + data->len); |
1277 xdefine("noptrbss", SNOPTRBSS, noptrbss->vaddr); | 1291 xdefine("noptrbss", SNOPTRBSS, noptrbss->vaddr); |
1278 xdefine("enoptrbss", SNOPTRBSS, noptrbss->vaddr + noptrbss->len); | 1292 xdefine("enoptrbss", SNOPTRBSS, noptrbss->vaddr + noptrbss->len); |
1279 xdefine("end", SBSS, segdata.vaddr + segdata.len); | 1293 xdefine("end", SBSS, segdata.vaddr + segdata.len); |
1280 } | 1294 } |
OLD | NEW |