5 /* Solve the local references.
8 #define seg_index( s) ( nname - SEGBSS - 1 + s)
14 /* Check if this reference is solvable. External references contain
16 * Also remove useless relocation structures.
19 register struct outrelo *rp;
22 for ( rp = reloc_info; rp < relo; rp++) {
23 register struct outname *np = &symbol_table[rp->or_nami];
26 if ( np->on_valu != -1 && ! (np->on_type & S_COM)) {
27 register long oldval,newval;
30 switch( rp->or_sect - S_MIN) {
33 if ((rp->or_type & RELPC) &&
34 (np->on_type & S_TYP) - S_MIN == SEGTXT) {
43 "do_local_relo(): bad section %d\n",
48 if ( rp->or_type & RELO4) {
49 oldval = get4( sect, rp->or_addr);
50 newval = oldval + np->on_valu;
51 put4( sect, rp->or_addr, newval);
53 else if ( rp->or_type & RELO2) {
54 oldval = (long) get2( sect, rp->or_addr);
55 newval = oldval + np->on_valu;
56 put2( sect, rp->or_addr, (int) newval);
58 else if ( rp->or_type & RELO1) {
59 oldval = (long) get1( sect, rp->or_addr);
60 newval = oldval + np->on_valu;
61 put1( sect, rp->or_addr, (char) newval);
64 fprint( STDERR, "do_relo() : bad relocation size\n");
65 rp->or_nami = seg_index((np->on_type & S_TYP) - S_MIN);
67 "reloc %s adrr=%ld sect=%ld oldval=%ld newval=%ld def = %ld\n",
68 np->on_foff+string_area, rp->or_addr, rp->or_sect-S_MIN, oldval, newval, np->on_valu);
71 if (diff && diff == olddiff) {