X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=sect.c;h=781a81bda516c5e5fdbf7f0f06351a8a3e63f69e;hp=4dc7032c4c34a7834626589daf4f9eefa6c0df82;hb=ace0b549a94110b69ec61442f825fb421b79799a;hpb=4205233c8397c581b4d27ab36ab81ec896ef3dd0 diff --git a/sect.c b/sect.c index 4dc7032..781a81b 100644 --- a/sect.c +++ b/sect.c @@ -415,6 +415,15 @@ int ResolveFixups(int sno) // evexpr presumably issues the errors/warnings here if (evexpr(fup->expr, &eval, &eattr, &esym) != OK) continue; + + if (optim_pc) + if (eattr & REFERENCED) + if (eattr & DEFINED) + if (!(eattr & EQUATED)) + { + error("relocation not allowed"); + continue; + } } // Simple symbol else @@ -422,6 +431,15 @@ int ResolveFixups(int sno) SYM * sy = fup->symbol; eattr = sy->sattr; + if (optim_pc) + if (eattr & REFERENCED) + if (eattr & DEFINED) + if (!(eattr & EQUATED)) + { + error("relocation not allowed"); + continue; + } + if (eattr & DEFINED) eval = sy->svalue; else @@ -450,9 +468,6 @@ int ResolveFixups(int sno) // from the location (that will happen in the linker when the external // reference is resolved). // - // MWC expects PC-relative things to have the LOC subtracted from the - // value, if the value is external (that is, undefined at this point). - // // PC-relative fixups must be DEFINED and either in the same section // (whereupon the subtraction takes place) or ABS (with no subtract). if ((dw & FU_PCREL) || (dw & FU_PCRELX)) @@ -470,7 +485,7 @@ int ResolveFixups(int sno) else if (tdb) { // Allow cross-section PCREL fixups in Alcyon mode - if (prg_flag) + if (prg_flag || (obj_format == RAW)) { switch (tdb) { @@ -504,14 +519,6 @@ int ResolveFixups(int sno) if (sbra_flag && (dw & FU_LBRA) && (eval + 0x80 < 0x100)) warn("unoptimized short branch"); } - else if (obj_format == MWC) - { - eval -= loc; - - // In this instruction the PC is located a DWORD away - if (dw & FU_PCRELX) - eval += 2; - } // Be sure to clear any TDB flags, since we handled it just now tdb = 0;