static void write_output(FILE *f,section *sec,symbol *sym) { section *s,*s2,**seclist,**slp; atom *p; size_t nsecs; unsigned long long pc,npc,i; if (!sec) return; for (; sym; sym=sym->next) { if (sym->type == IMPORT) output_error(6,sym->name); /* undefined symbol */ } /* we don't support overlapping sections */ for (s=sec,nsecs=0; s!=NULL; s=s->next) { for (s2=s->next; s2; s2=s2->next) { if (((ULLTADDR(s2->org) >= ULLTADDR(s->org) && ULLTADDR(s2->org) < ULLTADDR(s->pc)) || (ULLTADDR(s2->pc) > ULLTADDR(s->org) && ULLTADDR(s2->pc) <= ULLTADDR(s->pc)))) output_error(0); } nsecs++; } /* make an array of section pointers, sorted by their start address */ seclist = (section **)mymalloc(nsecs * sizeof(section *)); for (s=sec,slp=seclist; s!=NULL; s=s->next) *slp++ = s; if (nsecs > 1) qsort(seclist,nsecs,sizeof(section *),orgcmp); if (binfmt == BINFMT_CBMPRG) { /* Commodore 6502 PRG header: * 00: LSB of load address * 01: MSB of load address */ fw8(f,sec->org&0xff); fw8(f,(sec->org>>8)&0xff); }
static void print_type(FILE *f,symbol *p) { static const char *typename[] = {"???","obj","func","sect","file"}; int t; if (p == NULL) ierror(0); t = TYPE(p); fprintf(f,"type=%s ",typename[t<=TYPE_LAST?t:0]); } void print_symbol(FILE *f,symbol *p) { if (p==NULL) ierror(0); /* this is usually an error in a cpu-backend, don't crash! */ fprintf(f,"%s ",p->name); if (p->type==LABSYM) fprintf(f,"LAB (0x%llx) ",ULLTADDR(p->pc)); if (p->type==IMPORT) fprintf(f,"IMP "); if (p->type==EXPRESSION){ fprintf(f,"EXPR("); print_expr(f,p->expr); fprintf(f,") "); } if (!(p->flags&(USED|VASMINTERN))) fprintf(f,"UNUSED "); if (p->flags&VASMINTERN) fprintf(f,"INTERNAL "); if (p->flags&EXPORT) fprintf(f,"EXPORT "); if (p->flags&COMMON) fprintf(f,"COMMON "); if (p->flags&WEAK) fprintf(f,"WEAK "); if (p->flags&LOCAL) fprintf(f,"LOCAL "); if (p->flags&PROTECTED) fprintf(f,"PROT "); if (p->flags&REFERENCED) fprintf(f,"REF "); if (p->flags&ABSLABEL) fprintf(f,"ABS "); if (p->flags&EQUATE) fprintf(f,"EQU "); if (p->flags®LIST) fprintf(f,"REGL "); if (TYPE(p)) print_type(f,p); if (p->size){ fprintf(f,"size="); print_expr(f,p->size); fprintf(f," "); } if (p->align) fprintf(f,"align=%lu ",(unsigned long)p->align); if (p->sec) fprintf(f,"sec=%s ",p->sec->name); } char *get_bind_name(symbol *p) { if (p->flags&EXPORT) return "global"; else if (p->flags&WEAK) return "weak"; else if (p->flags&LOCAL) return "local"; return "unknown"; } void add_symbol(symbol *p) { hashdata data; p->next = first_symbol; first_symbol = p; data.ptr = p; add_hashentry(symhash,p->name,data); }