/* fix_data -- fix up global refs in the data segment */ void fix_data(uchar *base, int bss) { int i, u, v; /* Shift BSS symbols by offset bss */ for (i = 0; i < ndict; i++) { symbol s = dict[i]; if (s->s_seg == BSS) s->s_value += bss; } /* Fix up each symbol */ for (i = 0; i < ndict; i++) { symbol s = dict[i]; int val; if (s->s_uchain == -1) continue; if (dflag > 0) printf("Fixing %s\n", s->s_name); val = sym_value(s); /* Run along the use chain, inserting the value */ for (u = s->s_uchain; u != -1; u = v) { v = *((int *) &base[u]); put4(&base[u], val); relocate(u, (s->s_seg == ABS ? R_WORD : R_DATA)); } } }
/* SYMBOL 型の value を作成する */ value* sym_new(char* const val) { value* res = value_new(); *res = sym_value(val); return res; }