scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

pass3.c (1343B)


      1 #include <ctype.h>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 
      5 #include <scc/mach.h>
      6 
      7 #include "ld.h"
      8 
      9 /* TODO: This function must go in pass2 */
     10 static void
     11 rebase(Obj *obj)
     12 {
     13 	Symbol *aux;
     14 	Objsym *sym;
     15 
     16 	for (sym = obj->syms; sym; sym = sym->next) {
     17 		switch (sym->type) {
     18 		case 'T':
     19 		case 'D':
     20 		case 'B':
     21 			/*
     22 			 * this lookup must succeed, otherwise
     23 			 * we have an error in our code.
     24 			 */
     25 			aux = lookup(sym->name);
     26 			aux->value += obj->secs[sym->index].base;
     27 		case 't':
     28 		case 'd':
     29 		case 'b':
     30 			sym->value += obj->secs[sym->index].base;
     31 		case 'U':
     32 		case 'N':
     33 		case '?':
     34 			break;
     35 		default:
     36 			abort();
     37 		}
     38 	}
     39 }
     40 
     41 /*
     42  * rebase all the sections
     43  */
     44 void
     45 pass3(int argc, char *argv[])
     46 {
     47 	int i;
     48 	Obj *obj;
     49 	Section *sec;
     50 	Segment *seg;
     51 
     52 	/*
     53 	 * TODO: deal with page aligment
     54 	 */
     55 	text.base = 0x100;
     56 	rodata.base = text.base + text.size;
     57 	data.base = rodata.base + rodata.size;
     58 	bss.base = data.base + data.size;
     59 
     60 	for (obj = objhead; obj; obj = obj->next) {
     61 		for (i = 0; getsec(obj, &i, &sec); i++) {
     62 			/* TODO: deal with symbol aligment */
     63 			switch (sec->type) {
     64 			case 'T':
     65 				seg = &text;
     66 				break;
     67 			/* TODO: what happens with rodata? */
     68 			case 'D':
     69 				seg = &data;
     70 				break;
     71 			case 'B':
     72 				seg = &bss;
     73 				break;
     74 			default:
     75 				abort();
     76 			}
     77 
     78 			rebase(obj, i, seg->size);
     79 			seg->size += sec.size;
     80 		}
     81 	}
     82 }