ack/mach/sun3/ce/relocation.c

47 lines
1 KiB
C
Raw Normal View History

1988-09-28 16:47:47 +00:00
#include <system.h>
#include <out.h>
#include "back.h"
1988-10-31 15:02:39 +00:00
/* Written to run on SUN, and generate code for SUN */
1989-01-17 09:48:32 +00:00
extern long _base_address[];
1988-09-28 16:47:47 +00:00
do_local_relocation()
{
register struct outrelo *rp;
1988-09-28 16:47:47 +00:00
/* print( "n relocation records %d\n", relo - reloc_info); */
1989-01-17 09:48:32 +00:00
_base_address[SEGTXT] = 0;
_base_address[SEGCON] = text - text_area;
_base_address[SEGBSS] = _base_address[SEGCON] + data - data_area;
for ( rp = reloc_info; rp < relo; rp++) {
register struct outname *np = &symbol_table[rp->or_nami];
1988-09-28 16:47:47 +00:00
if ( np->on_valu != -1 && ! (np->on_type & S_COM)) {
register char *sect;
1988-09-28 16:47:47 +00:00
switch( rp->or_sect - S_MIN) {
case SEGTXT:
sect = text_area;
break;
case SEGCON:
sect = data_area;
break;
default:
fprint( STDERR,
"do_local_relo(): bad section %d\n",
rp->or_sect - S_MIN);
break;
}
if ( rp->or_type & RELO4)
1988-10-31 15:02:39 +00:00
*((long *)(sect+rp->or_addr)) +=
np->on_valu +
1989-01-17 09:48:32 +00:00
_base_address[(np->on_type&S_TYP)-S_MIN];
else
1988-10-31 15:02:39 +00:00
fprint( STDERR,
"do_relo() : bad relocation size\n");
}
1988-09-28 16:47:47 +00:00
}
}