relocation.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <system.h>
  2. #include <out.h>
  3. #include "back.h"
  4. /* Written to run on VAX, and generate code for VAX */
  5. extern long B_base_address[];
  6. do_local_relocation()
  7. {
  8. register struct outrelo *rp;
  9. /* print( "n relocation records %d\n", relo - reloc_info); */
  10. B_base_address[SEGTXT] = 0;
  11. B_base_address[SEGCON] = text - text_area;
  12. B_base_address[SEGBSS] = B_base_address[SEGCON] + data - data_area;
  13. for ( rp = reloc_info; rp < relo; rp++) {
  14. register struct outname *np = &symbol_table[rp->or_nami];
  15. if ( np->on_valu != -1 && ! (np->on_type & S_COM)) {
  16. register char *sect;
  17. switch( rp->or_sect - S_MIN) {
  18. case SEGTXT:
  19. sect = text_area;
  20. break;
  21. case SEGCON:
  22. sect = data_area;
  23. break;
  24. default:
  25. fprint( STDERR,
  26. "do_local_relo(): bad section %d\n",
  27. rp->or_sect - S_MIN);
  28. break;
  29. }
  30. if ( rp->or_type & RELO4)
  31. *((long *)(sect+rp->or_addr)) +=
  32. np->on_valu +
  33. B_base_address[(np->on_type&S_TYP)-S_MIN];
  34. else
  35. fprint( STDERR,
  36. "do_relo() : bad relocation size\n");
  37. }
  38. }
  39. }