Fix from John Coffman to 16-bit OBJ format output.

This commit is contained in:
H. Peter Anvin 2002-05-09 05:35:23 +00:00
parent c936bae6f0
commit 8ff796d817

View file

@ -76,7 +76,7 @@
* next operation. * next operation.
*/ */
#define RECORD_MAX 1024-3 /* maximal size of any record except type+reclen */ #define RECORD_MAX (1024-3) /* maximal size of any record except type+reclen */
#define OBJ_PARMS 3 /* maximum .parm used by any .ori routine */ #define OBJ_PARMS 3 /* maximum .parm used by any .ori routine */
#define FIX_08_LOW 0x8000 /* location type for various fixup subrecords */ #define FIX_08_LOW 0x8000 /* location type for various fixup subrecords */
@ -133,7 +133,7 @@ struct ObjRecord {
ObjRecord **up; /* Master pointer to this ObjRecord */ ObjRecord **up; /* Master pointer to this ObjRecord */
ObjRecord *back; /* Previous part of this record */ ObjRecord *back; /* Previous part of this record */
unsigned long parm[OBJ_PARMS]; /* Parameters for ori routine */ unsigned long parm[OBJ_PARMS]; /* Parameters for ori routine */
unsigned char buf[RECORD_MAX]; unsigned char buf[RECORD_MAX+3];
}; };
static void obj_fwrite(ObjRecord *orp); static void obj_fwrite(ObjRecord *orp);
@ -843,7 +843,19 @@ fprintf(stderr, " obj_deflabel: %s, seg=%ld, off=%ld, is_global=%d, %s\n",
ext->name = name; ext->name = name;
/* Place by default all externs into the current segment */ /* Place by default all externs into the current segment */
ext->defwrt_type = DEFWRT_NONE; ext->defwrt_type = DEFWRT_NONE;
/* 28-Apr-2002 - John Coffman
The following code was introduced on 12-Aug-2000, and breaks fixups
on code passed thru the MSC 5.1 linker (3.66) and MSC 6.00A linker
(5.10). It was introduced after FIXUP32 was added, and may be needed
for 32-bit segments. The following will get 16-bit segments working
again, and maybe someone can correct the 'if' condition which is
actually needed.
*/
#if 0
if (current_seg) { if (current_seg) {
#else
if (current_seg && current_seg->use32) {
if (current_seg->grp) { if (current_seg->grp) {
ext->defwrt_type = DEFWRT_GROUP; ext->defwrt_type = DEFWRT_GROUP;
ext->defwrt_ptr.grp = current_seg->grp; ext->defwrt_ptr.grp = current_seg->grp;
@ -852,6 +864,8 @@ fprintf(stderr, " obj_deflabel: %s, seg=%ld, off=%ld, is_global=%d, %s\n",
ext->defwrt_ptr.seg = current_seg; ext->defwrt_ptr.seg = current_seg;
} }
} }
#endif
if (is_global == 2) { if (is_global == 2) {
ext->commonsize = offset; ext->commonsize = offset;
ext->commonelem = 1; /* default FAR */ ext->commonelem = 1; /* default FAR */