ref: 2c616f66467f5e2708b7f8f46d96469181c4c406
dir: /src/cmd/ld/pass3.c/
#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <scc/mach.h> #include "ld.h" /* TODO: This function must go in pass2 */ static void rebase(Obj *obj) { Symbol *aux; Objsym *sym; for (sym = obj->syms; sym; sym = sym->next) { switch (sym->type) { case 'T': case 'D': case 'B': /* * this lookup must succeed, otherwise * we have an error in our code. */ aux = lookup(sym->name); aux->value += obj->secs[sym->index].base; case 't': case 'd': case 'b': sym->value += obj->secs[sym->index].base; case 'U': case 'N': case '?': break; default: abort(); } } } /* * rebase all the sections */ void pass3(int argc, char *argv[]) { Obj *obj; Objlst *lst; Objsec *sp; Segment *seg; /* * TODO: deal with page aligment */ text.base = 0x100; rodata.base = text.base + text.size; data.base = rodata.base + rodata.size; bss.base = data.base + data.size; for (lst = objhead; lst; lst = lst->next) { obj = lst->obj; for (sp = obj->secs; sp; sp = sp->next) { switch (sp->type) { case 'T': seg = &text; break; /* TODO: what happens with rodata? */ case 'D': seg = &data; break; case 'B': seg = &bss; break; default: abort(); } sp->base = seg->base + seg->size; /* TODO: deal with symbol aligment */ seg->size += sp->size; } rebase(obj); } }