/* 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));
          }
     }
}
Beispiel #2
0
/* SYMBOL 型の value を作成する */
value* sym_new(char* const val)
{
  value* res = value_new();
  *res = sym_value(val);
  return res;
}