]> Shamusworld >> Repos - rln/blobdiff - rln.c
Fixed bug with iscommon() macro.
[rln] / rln.c
diff --git a/rln.c b/rln.c
index 2e0c76745fa4438d8a2d0fa32708e0ae3545271f..02d2ca85273bd1a7c884acc5758c85ba90fd351b 100644 (file)
--- a/rln.c
+++ b/rln.c
@@ -20,9 +20,10 @@ unsigned oflag = 0;                     // Output filename specified
 unsigned rflag = 0;                     // Segment alignment size flag
 unsigned sflag = 0;                     // Output only global symbols
 unsigned vflag = 0;                     // Verbose flag
+unsigned wflag = 0;                     // Show warnings flag
 unsigned zflag = 0;                     // Suppress banner flag
-unsigned pflag, uflag, wflag = 1;           // Unimplemented flags
-unsigned hd = 0;                        // Index of next file handle to fill 
+unsigned pflag, uflag;                  // Unimplemented flags
+unsigned hd = 0;                        // Index of next file handle to fill
 unsigned secalign = 7;                  // Section Alignment (8=phrase)
 unsigned tbase = 0;                     // TEXT base address
 unsigned dbase = 0;                     // DATA base address
@@ -36,26 +37,26 @@ unsigned dosymi = 0;                    // Dosym() processing iterator
 unsigned dbgsymbase = 0;                // Debug symbol base address
 //unsigned symtrunc = 0;                // Symbol truncation -i and -ii
 int noheaderflag = 0;                   // No header flag for ABS files
-int hflags;                             // Value of the arg to -h option 
-int ttype, dtype, btype;                // Type flag: 0, -1, -2, -3, -4 
-int tval, dval, bval;                   // Values of these abs bases 
+int hflags;                             // Value of the arg to -h option
+int ttype, dtype, btype;                // Type flag: 0, -1, -2, -3, -4
+int tval, dval, bval;                   // Values of these abs bases
 int hflag[NHANDLES];                    // True for include files
-int handle[NHANDLES];                   // Open file handles 
-int textsize, datasize, bsssize;        // Cumulative segment sizes 
+int handle[NHANDLES];                   // Open file handles
+int textsize, datasize, bsssize;        // Cumulative segment sizes
 char libdir[FARGSIZE * 3];              // Library directory to search
-char ofile[FARGSIZE];                   // Output file name (.o) 
-char * name[NHANDLES];                  // Associated file names 
+char ofile[FARGSIZE];                   // Output file name (.o)
+char * name[NHANDLES];                  // Associated file names
 char * cmdlnexec = NULL;                // Executable name - pointer to ARGV[0]
-char * hsym1[SYMLEN];                   // First symbol for include files 
-char * hsym2[SYMLEN];                   // Second symbol for include files 
+char * hsym1[SYMLEN];                   // First symbol for include files
+char * hsym2[SYMLEN];                   // Second symbol for include files
 struct OFILE * plist = NULL;            // Object image list pointer
 struct OFILE * plast;                   // Last object image list pointer
 struct OFILE * olist = NULL;            // Pointer to first object file in list
 struct OFILE * olast;                   // Pointer to last object file in list
 char obj_fname[512][FNLEN];             // Object file names
 unsigned obj_segsize[512][3];           // Object file seg sizes; TEXT,DATA,BSS
-unsigned obj_index = 0;                 // Object file index/count   
-struct HREC * htable[NBUCKETS];         // Hash table 
+unsigned obj_index = 0;                 // Object file index/count
+struct HREC * htable[NBUCKETS];         // Hash table
 struct HREC * unresolved = NULL;        // Pointer to unresolved hash list
 struct HREC * lookup(char *);           // Hash lookup
 char * ost;                             // Output symbol table
@@ -67,18 +68,22 @@ char * oststr_end;                      // Output string table; end pointer
 int ost_index = 0;                      // Index of next ost addition
 int endian;                             // Processor endianess
 
+// Some human readable defines for endianess
+#define ENDIANNESS_BIG     1
+#define ENDIANNESS_LITTLE  0
+
 
 //
 // Get a Long Word from Memory
 //
-unsigned getlong(char * src)
+uint32_t getlong(uint8_t * src)
 {
-       unsigned temp;
-       char * out;
-               
-       out = (char *)&temp;
+       uint32_t temp;
+       uint8_t * out;
+
+       out = (uint8_t *)&temp;
 
-       if (endian == 1)
+       if (endian == ENDIANNESS_BIG)
        {
                *out++ = src[0];
                *out++ = src[1];
@@ -100,28 +105,43 @@ unsigned getlong(char * src)
 //
 // Put a Long Word into Memory
 //
-void putlong(char * dest, unsigned val)
+void putlong(uint8_t * dest, uint32_t val)
 {
-       *dest++ = (char)(val >> 24);
-       *dest++ = (char)(val >> 16);
-       *dest++ = (char)(val >> 8);
-       *dest = (char)val;
+       *dest++ = (uint8_t)(val >> 24);
+       *dest++ = (uint8_t)(val >> 16);
+       *dest++ = (uint8_t)(val >> 8);
+       *dest = (uint8_t)val;
 }
 
 
 //
 // Get a Word from Memory
 //
-int getword(char * src)
+uint16_t getword(uint8_t * src)
 {
-       unsigned temp;
-       char * out;
+       uint16_t temp;
+       uint8_t * out;
 
-       out = (char *)&temp;
+       out = (uint8_t *)&temp;
+#if 0
+       // Shamus: This assumes little endian...
        *out++ = src[1];
        *out++ = src[0];
-       *out++ = 0;
-       *out = 0;
+// Shamus: And *why* do this as a uint32_t???
+//     *out++ = 0;
+//     *out = 0;
+#else
+       if (endian == ENDIANNESS_BIG)
+       {
+               out[0] = src[0];
+               out[1] = src[1];
+       }
+       else
+       {
+               out[0] = src[1];
+               out[1] = src[0];
+       }
+#endif
 
        return temp;
 }
@@ -130,10 +150,10 @@ int getword(char * src)
 //
 // Put a Word into Memory
 //
-void putword(char * dest, int val)
+void putword(uint8_t * dest, uint16_t val)
 {
-       *dest++ = (char)(val >> 8);
-       *dest = (char)val;
+       *dest++ = (uint8_t)(val >> 8);
+       *dest = (uint8_t)val;
 }
 
 
@@ -158,18 +178,18 @@ long FSIZE(int fd)
 //
 int dosym(struct OFILE * ofile)
 {
-       char * symptr;                                            // Symbol pointer
-       char * symend;                                            // Symbol end pointer
-       int type;                                                // Symbol type
-       long value;                                              // Symbol value
-       int index;                                               // Symbol index
-       int j;                                                   // Iterator
-       int ssidx;                                               // Segment size table index
-       unsigned tsegoffset;                                     // Cumulative TEXT segment offset
-       unsigned dsegoffset;                                     // Cumulative DATA segment offset
-       unsigned bsegoffset;                                     // Cumulative BSS segment offset
-       struct HREC * hptr;                                       // Hash table pointer for globl/extrn
-       char sym[SYMLEN];                                        // String for symbol name/hash search
+       char * symptr;                          // Symbol pointer
+       char * symend;                          // Symbol end pointer
+       int type;                                       // Symbol type
+       long value;                                     // Symbol value
+       int index;                                      // Symbol index
+       int j;                                          // Iterator
+       int ssidx;                                      // Segment size table index
+       unsigned tsegoffset;            // Cumulative TEXT segment offset
+       unsigned dsegoffset;            // Cumulative DATA segment offset
+       unsigned bsegoffset;            // Cumulative BSS segment offset
+       struct HREC * hptr;                     // Hash table pointer for globl/extrn
+       char sym[SYMLEN];                       // String for symbol name/hash search
 
        // Point to first symbol record in the object file
        symptr = (ofile->o_image + 32
@@ -179,15 +199,16 @@ int dosym(struct OFILE * ofile)
                + ofile->o_header.absrel.reloc.dsize);
 
        // Point to end of symbol record in the object file
-       symend = symptr + ofile->o_header.ssize;                 
+       symend = symptr + ofile->o_header.ssize;
 
-       // Search through object segment size table to accumulated segment sizes to ensure 
+       // Search through object segment size table to accumulated segment sizes to ensure
        // the correct offsets are used in the resulting COF file.
        ssidx = -1;                                              // Initialise segment index
        tsegoffset = dsegoffset = bsegoffset = 0;                // Initialise segment offsets
 
+       // Search for object file name
        for(j=0; j<(int)obj_index; j++)
-       {                    // Search for object file name
+       {
                if (!strcmp(ofile->o_name, obj_fname[j]))
                {
                        ssidx = j;                                         // Object file name found
@@ -203,7 +224,7 @@ int dosym(struct OFILE * ofile)
        {
                printf("dosym() : Cannot get object file segment size : %s\n", ofile->o_name);
                return 1;
-       }   
+       }
 
        // Process each record in the symbol table
        for(; symptr!=symend; symptr+=12)
@@ -215,10 +236,11 @@ int dosym(struct OFILE * ofile)
                // Global/External symbols have a pre-processing stage
                if (type & 0x01000000)
                {
-                       // Obtain the string table index for the relocation symbol, look for it in the globals
-                       // hash table to obtain information on that symbol. For the hash calculation to work
-                       // correctly it must be placed in a 'clean' string before looking it up.
-                       memset(sym, 0, SYMLEN);          
+                       // Obtain the string table index for the relocation symbol, look
+                       // for it in the globals hash table to obtain information on that
+                       // symbol. For the hash calculation to work correctly it must be
+                       // placed in a 'clean' string before looking it up.
+                       memset(sym, 0, SYMLEN);
                        strcpy(sym, symend + index);
                        hptr = lookup(sym);
 
@@ -228,10 +250,11 @@ int dosym(struct OFILE * ofile)
                                return 1;
                        }
 
-                       // Search through object segment size table to obtain segment sizes for the object 
-                       // that has the required external/global as a local symbol. As each object is
-                       // interrogated the segment sizes are accumulated to ensure the correct offsets are
-                       // used in the resulting COF file.  This is effectively 'done again' only as we 
+                       // Search through object segment size table to obtain segment sizes
+                       // for the object that has the required external/global as a local
+                       // symbol. As each object is interrogated the segment sizes are
+                       // accumulated to ensure the correct offsets are used in the
+                       // resulting COF file.  This is effectively 'done again' only as we
                        // are working with a different object file.
                        ssidx = -1;                                        // Initialise segment index
                        tsegoffset = dsegoffset = bsegoffset = 0;          // Initialise segment offsets
@@ -251,18 +274,19 @@ int dosym(struct OFILE * ofile)
 
                        if (ssidx == -1)
                        {
-                               printf("dosym() : Cannot get object file segment size : %s\n", 
+                               printf("dosym() : Cannot get object file segment size : %s\n",
                                        ofile->o_name);
                                return 1;
                        }
 
                        type = hptr->h_type;                               // Update type with global type
 
-                       if (type == 0x03000000) 
+                       if (type == 0x03000000)
                                type = 0x02000000;          // Reset external flag if absolute
 
-                       // If the global/external has a value then update that vaule in accordance with the
-                       // segment sizes of the object file it originates from
+                       // If the global/external has a value then update that vaule in
+                       // accordance with the segment sizes of the object file it
+                       // originates from
                        if (hptr->h_value)
                        {
                                switch (hptr->h_type & 0x0E000000)
@@ -282,34 +306,37 @@ int dosym(struct OFILE * ofile)
                        }
                }
 
-               // Process and update the value dependant on whether the symbol is a debug symbol or not
+               // Process and update the value dependant on whether the symbol is a
+               // debug symbol or not
                if (type & 0xF0000000)
                {                               // DEBUG SYMBOL
                        // Set the correct debug symbol base address (TEXT segment)
                        dbgsymbase = 0;
 
-                       for(j=0; (unsigned)j<dosymi; j++) 
+                       for(j=0; (unsigned)j<dosymi; j++)
                                dbgsymbase += obj_segsize[j][0];
 
                        switch (type & 0xFF000000)
                        {
-                       case 0x64000000: 
-                               value = tval + dbgsymbase; 
+                       case 0x64000000:
+                               value = tval + dbgsymbase;
                                break;
                        case 0x44000000:
                        case 0x46000000:
                        case 0x48000000:
                                value = tval + dbgsymbase + value;
-                       default: 
+                       default:
                                break;
                        }
 
                        putlong(symptr + 8, value);
                }
                else
-               {                                              // NON-DEBUG SYMBOL
-                       // Now make modifications to the symbol value, local or global, based on the segment sizes
-                       // of the object file currently being processed.
+               {
+                       // NON-DEBUG SYMBOL
+                       // Now make modifications to the symbol value, local or global,
+                       // based on the segment sizes of the object file currently being
+                       // processed.
                        switch (type & T_SEG)
                        {
                        case 0x02000000:                                // Absolute value
@@ -335,32 +362,34 @@ int dosym(struct OFILE * ofile)
                                        value = bbase + bsegoffset + value;
                                else
                                        value = bbase + bsegoffset
-                                               +(value - (ofile->o_header.tsize + ofile->o_header.dsize));
+                                               + (value - (ofile->o_header.tsize + ofile->o_header.dsize));
 
                                putlong(symptr + 8, value);
                                break;
                        default:
                                break;
                        }
-               } 
+               }
 
                // Add to output symbol table
                if (lflag || !islocal(type))
                {
                        if (islocal(type) || isglobal(type))
                        {
-                               if ((index = ost_add(symend + index, type, value)) == -1) 
+                               if ((index = ost_add(symend + index, type, value)) == -1)
                                        return 1;
                        }
                        else
                        {
                                // Belongs in OST, but don't look it up yet
-                               index = -1;     
+                               index = -1;
                        }
                }
        }
 
-       dosymi++;                                                // Increment dosym() processsing
+       // Increment dosym() processsing
+       dosymi++;
+
        return 0;
 }
 
@@ -387,13 +416,13 @@ void hash_free(void)
 }
 
 
-// 
+//
 // Add all Global and External Symbols to the Output Symbol Table
-// 
+//
 long docommon(void)
 {
-       struct HREC * hptr;                                       // Hash record pointer
-       int i;                                                   // Iterator
+       struct HREC * hptr;                                                     // Hash record pointer
+       int i;                                                                          // Iterator
 
        for(i=0; i<NBUCKETS; i++)
        {
@@ -402,11 +431,11 @@ long docommon(void)
                        if (iscommon(hptr->h_type))
                        {
                                if (hptr->h_type == 0x03000000)
-                                       hptr->h_type = 0x02000000;                   // Absolutes can't be externals
+                                       hptr->h_type = 0x02000000;      // Absolutes can't be externals
 
                                if (ost_add(hptr->h_sym, hptr->h_type, hptr->h_value) == -1)
                                        return -1;
-                       } 
+                       }
                }
        }
 
@@ -415,14 +444,14 @@ long docommon(void)
 
 
 //
-// Add a Symbol's Name, Type, and Value to the OST. 
+// Add a Symbol's Name, Type, and Value to the OST.
 // Return the Index of the Symbol in OST, or -1 for Error.
 //
 int ost_add(char * name, int type, long value)
 {
-       int ost_offset_p, ost_offset_e = 0;                      // OST table offsets for position calcs
-       int slen = 0;                                            // Symbol string length
-       int ostresult;                                           // OST index result
+       int ost_offset_p, ost_offset_e = 0;                     // OST table offsets for position calcs
+       int slen = 0;                                                           // Symbol string length
+       int ostresult;                                                          // OST index result
 
        slen = strlen(name);
 
@@ -455,8 +484,9 @@ int ost_add(char * name, int type, long value)
                ost_offset_p = (ost_ptr - ost);
                ost_offset_e = (ost_end - ost);
 
+               // 3 x int (12)
                if ((ost_ptr + 12) > ost_end)
-               {                  // 3 x int (12)
+               {
                        if ((ost = realloc(ost, (unsigned)(ost_end + OST_BLOCK))) == NULL)
                        {
                                printf("OST memory reallocation error.\n");
@@ -470,7 +500,7 @@ int ost_add(char * name, int type, long value)
                ost_offset_p = (oststr_ptr - oststr);
                ost_offset_e = (oststr_end - oststr);
 
-               if ((oststr_ptr + (slen+1+4)) > oststr_end)
+               if ((oststr_ptr + (slen + 1 + 4)) > oststr_end)
                {
                        if ((oststr = realloc(oststr, (unsigned)(oststr_end + OST_BLOCK))) == NULL)
                        {
@@ -483,7 +513,8 @@ int ost_add(char * name, int type, long value)
                }
        }
 
-       // If this is a debug symbol and the include debug symbol flag (-g) is not set then do nothing
+       // If this is a debug symbol and the include debug symbol flag (-g) is not
+       // set then do nothing
        if ((type & 0xF0000000) && !gflag)
        {
                // Do nothing
@@ -491,11 +522,13 @@ int ost_add(char * name, int type, long value)
        else
        {
                ostresult = ost_lookup(name);                         // Get symbol index in OST
-               // If the symbol is in the output symbol table and the bflag is set (don't remove multiply 
-               // defined locals) and this is not an external/global symbol *** OR *** the symbol is not 
-               // in the output symbol table then add it.
+
+               // If the symbol is in the output symbol table and the bflag is set
+               // (don't remove multiply defined locals) and this is not an
+               // external/global symbol *** OR *** the symbol is not in the output
+               // symbol table then add it.
                if (((ostresult != -1) && bflag && !(type & 0x01000000))
-                       || ((ostresult != -1) && gflag &&  (type & 0xF0000000)) || (ostresult == -1))
+                       || ((ostresult != -1) && gflag && (type & 0xF0000000)) || (ostresult == -1))
                {
                        if ((type & 0xF0000000) == 0x40000000)
                                putlong(ost_ptr, 0x00000000);                   // Zero string table offset for dbg line
@@ -506,8 +539,8 @@ int ost_add(char * name, int type, long value)
                        putlong(ost_ptr + 8, value);
                        ost_ptr += 12;
 
-                       // If the symbol type is anything but a debug line information symbol then write 
-                       // the symbol string to the string table
+                       // If the symbol type is anything but a debug line information
+                       // symbol then write the symbol string to the string table
                        if ((type & 0xF0000000) != 0x40000000)
                        {
                                strcpy(oststr_ptr, name);                       // Put symbol name in string table
@@ -521,7 +554,8 @@ int ost_add(char * name, int type, long value)
                }
        }
 
-       return 0; // not sure about this as it could affect return indices. needed to stop return error.
+       // not sure about this as it could affect return indices. needed to stop return error.
+       return 0;
 }
 
 
@@ -535,10 +569,10 @@ int ost_lookup(char * sym)
 
        for(i=0; i<ost_index; i++)
        {
-               if (!strcmp(oststr + stro, sym))
+               if (strcmp(oststr + stro, sym) == 0)
                        return i + 1;
-               else
-                       stro += strlen(oststr + stro) + 1;
+
+               stro += strlen(oststr + stro) + 1;
        }
 
        return -1;
@@ -559,6 +593,9 @@ int dounresolved(void)
                if (ost_add(hptr->h_sym, T_EXT, 0L) == -1)
                        return 1;
 
+               if (vflag > 1)
+                       printf("dounresolved(): added %s\n", hptr->h_sym);
+
                htemp = hptr->h_next;                   // Temporarily get ptr to next record
                free(hptr);                             // Free current record
                hptr = htemp;                           // Make next record ptr, current
@@ -576,7 +613,7 @@ int dounresolved(void)
 //
 int reloc_segment(struct OFILE * ofile, int flag)
 {
-       char * symtab;                              // Start of symbol table 
+       char * symtab;                              // Start of symbol table
        char * symbols;                             // Start of symbols
        char * sptr;                                // Start of segment data
        char * rptr;                                // Start of segment relocation records
@@ -601,7 +638,7 @@ int reloc_segment(struct OFILE * ofile, int flag)
        {
                // TEXT segment size plus padding
                pad = ((ofile->o_header.tsize+secalign) & ~secalign);
-               textoffset += (ofile->o_header.tsize + (pad - ofile->o_header.tsize)); 
+               textoffset += (ofile->o_header.tsize + (pad - ofile->o_header.tsize));
 
                if (vflag > 1)
                        printf("reloc_segment(%s, TEXT) : No Relocation Data\n", ofile->o_name);
@@ -630,7 +667,7 @@ int reloc_segment(struct OFILE * ofile, int flag)
        // Verbose mode information
        if (vflag > 1)
        {
-               printf("reloc_segment(%s, %s) : Processing Relocation Data\n", 
+               printf("reloc_segment(%s, %s) : Processing Relocation Data\n",
                        ofile->o_name, flag == T_DATA ? "DATA" : "TEXT");
        }
 
@@ -642,13 +679,18 @@ int reloc_segment(struct OFILE * ofile, int flag)
        symbols = symtab + ofile->o_header.ssize;
 
        // Obtain pointer to start of TEXT segment
-       sptr = ofile->o_image + 32;                              
+       sptr = ofile->o_image + 32;
 
        // Obtain pointer to start of TEXT relocation records
        rptr = sptr + (ofile->o_header.tsize + ofile->o_header.dsize);
 
        relocsize = ofile->o_header.absrel.reloc.tsize;
 
+    if (vflag)
+    {
+        printf("RELOCSIZE :: %d  Records = %d\n",relocsize,relocsize/8);
+    }
+
        // Update pointers if DATA relocation records are being processed
        if (flag == T_DATA)
        {
@@ -676,7 +718,7 @@ int reloc_segment(struct OFILE * ofile, int flag)
                        // symbol. For the hash calculation to work correctly it must be
                        // placed in a 'clean' string before looking it up.
                        symidx = getlong(symtab + ((rflg >> 8) * 12));
-                       memset(sym, 0, SYMLEN);          
+                       memset(sym, 0, SYMLEN);
                        strcpy(sym, symbols + symidx);
                        olddata = newdata = 0;              // Initialise old and new segment data
                        ssidx = ost_lookup(sym);
@@ -709,10 +751,10 @@ int reloc_segment(struct OFILE * ofile, int flag)
 // Braces were not here, so if something breaks, try pairing the else to the 1st 'if'...
                                if (!glblreloc)
                                {
-                                       if (flag == T_TEXT)
+                                       if (flag == T_TEXT)     // Is this a TEXT section record?
                                                newdata = tbase + textoffset + olddata;
                                        else
-                                               newdata = tbase + dataoffset + olddata;
+                                               newdata = tbase + dataoffset + olddata; // Nope, must be DATA section
                                }
 
                                break;
@@ -752,9 +794,15 @@ int reloc_segment(struct OFILE * ofile, int flag)
                }
 
                // Shamus: Let's output some info to aid in debugging this crap
-               if (vflag)
+               if (vflag > 1)
                {
-                       printf("reloc_segment(): %s, $%08X: $%08X => $%08X\n", (glblreloc ? sym : "(LOCAL)"), addr, olddata, getlong(sptr + addr));
+                       char ssiString[128];
+                       ssiString[0] = 0;
+
+                       if (glblreloc)
+                               sprintf(ssiString, " [ssi:%i]", ssidx);
+
+                       printf("reloc_segment($%08X): %s, $%08X: $%08X => $%08X%s\n", rflg, (glblreloc ? sym : "(LOCAL)"), addr, olddata, getlong(sptr + addr), ssiString);
                }
 
                rptr += 8;                              // Point to the next relocation record
@@ -774,7 +822,7 @@ int reloc_segment(struct OFILE * ofile, int flag)
                dataoffset += (ofile->o_header.dsize + (pad - ofile->o_header.dsize));
                // BSS segment plus padding
                pad = ((ofile->o_header.bsize + secalign) & ~secalign);
-               bssoffset += (ofile->o_header.bsize + (pad - ofile->o_header.bsize)); 
+               bssoffset += (ofile->o_header.bsize + (pad - ofile->o_header.bsize));
        }
 
        // Return value, should always be zero
@@ -822,7 +870,7 @@ int tryopen(char ** p_name)
        char * tmpbuf, * lastdot;                                // Buffer and 'dot' pointers
        int fd, hasdot;                                          // File descriptor and 'has dot' flag
 
-       // Note that libdir will be an empty string if there is none specified 
+       // Note that libdir will be an empty string if there is none specified
        if ((tmpbuf = malloc((long)strlen(name) + strlen(libdir) + 3)) == NULL)
        {
                printf("tryopen() : out of memory\n");
@@ -837,7 +885,7 @@ int tryopen(char ** p_name)
                goto ok;       // Try to open file as passed first
 
        if (!hasdot)
-       {                                         
+       {
                strcat(tmpbuf, ".o");                                 // Try to open file with '.o' added
 
                if ((fd = open(tmpbuf, _OPEN_FLAGS)) >= 0)
@@ -885,7 +933,7 @@ ok:
 void put_name(struct OFILE * p)
 {
        int flag = *(p->o_arname);
-       printf("%s%s%s", flag ? p->o_arname : "", flag ? ":" : "", p->o_name);
+       printf("%s%s%s", (flag ? (char *)(p->o_arname) : ""), (flag ? ":" : ""), p->o_name);
 }
 
 
@@ -913,7 +961,8 @@ int dofile(char * fname, int flag, char * sym)
        // Reached maximum file handles
        if (hd == NHANDLES)
        {
-               if (flush_handles()) return 1;
+               if (flush_handles())
+                       return 1;
        }
 
        // Attempt to open input file
@@ -923,7 +972,7 @@ int dofile(char * fname, int flag, char * sym)
                return 1;
        }
 
-       // The file is open; save its info in the handle and name arrays 
+       // The file is open; save its info in the handle and name arrays
        handle[hd] = fd;
        name[hd] = fname;                                        // This is the name from tryopen()
        hflag[hd] = flag;
@@ -933,15 +982,15 @@ int dofile(char * fname, int flag, char * sym)
        {
                temp = strlen(sym);                                   // Get symbol length
 
-               // 100 chars is max length of a symbol 
+               // 100 chars is max length of a symbol
                if (temp > 99)
                {
                        sym[99] = '\0';
                        temp = 99;
                }
 
-               // Malloc enough space for two symbols, then build the second one. Second one may be one 
-               // character longer than first 
+               // Malloc enough space for two symbols, then build the second one. Second one may be one
+               // character longer than first
                if ((hsym1[hd] = malloc((long)temp + 1)) == NULL
                        || (hsym2[hd] = malloc((long)temp + 2)) == NULL)
                {
@@ -1041,7 +1090,7 @@ int write_ofile(struct OHEADER * header)
        fd = fopen(ofile, "wb");                                 // Attempt to open output file
 
        if (!fd)
-       {                              
+       {
                printf("Can't open output file %s\n", ofile);         // Error opening output file
                return 1;
        }
@@ -1052,7 +1101,7 @@ int write_ofile(struct OHEADER * header)
        {
                tsoff = dsoff = bsoff = 0xA8;                         // Initialises segment offsets
 
-               // Process each object file segment size to obtain a cumulative segment size for both 
+               // Process each object file segment size to obtain a cumulative segment size for both
                // the TEXT and DATA segments
                for(i=0; i<(int)obj_index; i++)
                {
@@ -1078,11 +1127,11 @@ int write_ofile(struct OHEADER * header)
                putlong(himage + 28,  header->dsize        );         // DATA size in bytes
                putlong(himage + 32,  header->bsize        );         // BSS size in bytes
                putlong(himage + 36,  tbase                );         // Start of executable, normally @TEXT
-               putlong(himage + 40,  tbase                );         // @TEXT      
+               putlong(himage + 40,  tbase                );         // @TEXT
                putlong(himage + 44,  dbase                );         // @DATA
 
                // Build the TEXT SEC_HDR
-               putlong(himage + 48,  0x2E746578           );                     
+               putlong(himage + 48,  0x2E746578           );
                putlong(himage + 52,  0x74000000           );         // ".text"
                putlong(himage + 56,  tbase                );         // TEXT START
                putlong(himage + 60,  tbase                );         // TEXT START
@@ -1094,7 +1143,7 @@ int write_ofile(struct OHEADER * header)
                putlong(himage + 84,  0x00000020           );         // SEC_FLAGS: STYP_TEXT
 
                // Build the DATA SEC_HDR
-               putlong(himage + 88,  0x2E646174           );                     
+               putlong(himage + 88,  0x2E646174           );
                putlong(himage + 92,  0x61000000           );         // ".data"
                putlong(himage + 96,  dbase                );         // DATA START
                putlong(himage + 100, dbase                );         // DATA START
@@ -1106,7 +1155,7 @@ int write_ofile(struct OHEADER * header)
                putlong(himage + 124, 0x00000040           );         // SEC_FLAGS: STYP_DATA
 
                // Build the BSS SEC_HDR
-               putlong(himage + 128, 0x2E627373           );                     
+               putlong(himage + 128, 0x2E627373           );
                putlong(himage + 132, 0x00000000           );         // ".bss"
                putlong(himage + 136, bbase                );         // BSS START
                putlong(himage + 140, bbase                );         // BSS START
@@ -1128,7 +1177,7 @@ int write_ofile(struct OHEADER * header)
                putlong(himage + 6,   header->dsize        );         // DATA segment size
                putlong(himage + 10,  header->bsize        );         // BSS segment size
                putlong(himage + 14,  ost_index * 14       );         // Symbol table size (?)
-               putlong(himage + 18,  0x00000000           );         // 
+               putlong(himage + 18,  0x00000000           );         //
                putlong(himage + 22,  tbase                );         // TEXT base address
                putword(himage + 26,  0xFFFF               );         // Flags (?)
                putlong(himage + 28,  dbase                );         // DATA base address
@@ -1142,13 +1191,13 @@ int write_ofile(struct OHEADER * header)
        if (!cflag)
        {
                if (!noheaderflag)
-                       if (fwrite(himage, 36, 1, fd) != 1) 
+                       if (fwrite(himage, 36, 1, fd) != 1)
                                goto werror;
        }
        // Absolute (COF) header
        else
        {
-               if (fwrite(himage, 168, 1, fd) != 1) 
+               if (fwrite(himage, 168, 1, fd) != 1)
                        goto werror;
        }
 
@@ -1163,11 +1212,11 @@ int write_ofile(struct OHEADER * header)
                        if (vflag > 1)
                                printf("Writing TEXT Segment of %s\n", otemp->o_name);
 
-                       if (fwrite(otemp->o_image + 32, osize, 1, fd) != 1) 
+                       if (fwrite(otemp->o_image + 32, osize, 1, fd) != 1)
                                goto werror;
 
                        // Pad to required alignment boundary
-                       if (segmentpad(fd, osize, 0x0000))              
+                       if (segmentpad(fd, osize, 0x0000))
                                goto werror;
 
                        symoffset += osize;
@@ -1189,7 +1238,7 @@ int write_ofile(struct OHEADER * header)
                                goto werror;
 
                        // Pad to required alignment boundary
-                       if (segmentpad(fd, osize, 0))                        
+                       if (segmentpad(fd, osize, 0))
                                goto werror;
 
                        symoffset += osize;
@@ -1211,23 +1260,25 @@ int write_ofile(struct OHEADER * header)
                // Absolute (ABS) symbol/string table
                else
                {
-                       // The symbol and string table have been created as part of the dosym() function and the 
-                       // output symbol and string tables are in COF format. For an ABS file we need to process 
-                       // through this to create the 14 character long combined symbol and string table.
-                       // Format of symbol table in ABS: AAAAAAAATTVVVV, where (A)=STRING, (T)=TYPE & (V)=VALUE
+                       // The symbol and string table have been created as part of the
+                       // dosym() function and the output symbol and string tables are in
+                       // COF format. For an ABS file we need to process through this to
+                       // create the 14 character long combined symbol and string table.
+                       // Format of symbol table in ABS: AAAAAAAATTVVVV, where (A)=STRING,
+                       // (T)=TYPE & (V)=VALUE
 
                        for(i=0; i<ost_index; i++)
                        {
-                               memset(symbol, 0, 14);                             // Initialise symbol record
-                               abstype = 0;                                       // Initialise ABS symbol type
-                               slen = 0;                                          // Initialise symbol string length
-                               index = getlong(ost + (i * 12));                   // Get symbol index
-                               type  = getlong((ost + (i * 12)) + 4);             // Get symbol type
+                               memset(symbol, 0, 14);                          // Initialise symbol record
+                               abstype = 0;                                            // Initialise ABS symbol type
+                               slen = 0;                                                       // Initialise symbol string length
+                               index = getlong(ost + (i * 12));        // Get symbol index
+                               type  = getlong((ost + (i * 12)) + 4);  // Get symbol type
 
                                if (type & 0xF0000000)
                                        continue;                    // Not doing debug symbols
 
-                               value = getlong((ost + (i * 12)) + 8);             // Get symbol value
+                               value = getlong((ost + (i * 12)) + 8);  // Get symbol value
                                slen = strlen(oststr + index);
 
                                // Get symbol string (maximum 8 chars)
@@ -1258,26 +1309,26 @@ int write_ofile(struct OHEADER * header)
                                        break;
                                }
 
-                               putword(symbol + 8, abstype);                      // Write back new ABS type
-                               putlong(symbol + 10, value);                       // Write back value
+                               putword(symbol + 8, abstype);           // Write back new ABS type
+                               putlong(symbol + 10, value);            // Write back value
 
                                if (fwrite(symbol, 14, 1, fd) != 1) goto werror;    // Write symbol record
                        }
                }
        }
 
-       // Close the file 
+       // Close the file
        if (fclose(fd))
        {
                printf("Close error on output file %s\n",ofile);
                return 1;
        }
-       else
-               return 0;
 
-werror:                                                  // OMG! Why did Atari use these :)
+       return 0;
+
+werror: // OMG! Why did Atari use these :)
        printf("Write error on output file %s\n", ofile);
-       fclose(fd);                                                            // Try to close output file anyway
+       fclose(fd);                     // Try to close output file anyway
        return 1;
 }
 
@@ -1299,13 +1350,13 @@ int write_map(struct OHEADER * header)
 
        printf("LOAD MAP\n\n");
 
-       // Outer loop for each of the symbol areas to map out; 
+       // Outer loop for each of the symbol areas to map out;
        // 0 = NON-RELOCATABLE SYMBOLS
        // 1 = TEXT-SEGMENT RELOCATABLE SYMBOLS
        // 2 = DATA-SEGMENT RELOCATABLE SYMBOLS
        // 3 = BSS-SEGMENT RELOCATABLE SYMBOLS
        for(o=0; o<4; o++)
-       {                                 
+       {
                // Display the correct map header for the symbols being processed
                switch (o)
                {
@@ -1324,12 +1375,12 @@ int write_map(struct OHEADER * header)
                        type   = getlong(ost + (i * 12) + 4);              // Get symbol type
                        value  = getlong(ost + (i * 12) + 8);              // Get symbol value
                        symbol = oststr + index;                           // Get symbol string
-                       
+
                        // Display only three columns
                        if (c == 3)
                        {
                                printf("\n");
-                               c = 0;       
+                               c = 0;
                        }
 
                        // If local symbols not included and the type is local then go to next symbol record
@@ -1433,17 +1484,17 @@ int getval(char * string, int * value)
 //
 struct OHEADER * make_ofile()
 {
-       unsigned tptr, dptr, bptr;                               // Bases in runtime model
-       int ret = 0;                                             // Return value
-       struct OFILE * otemp, * oprev, * ohold;                  // Object file list pointers
-       struct OHEADER * header;                                 // Output header pointer
+       unsigned tptr, dptr, bptr;                                      // Bases in runtime model
+       int ret = 0;                                                            // Return value
+       struct OFILE * otemp, * oprev, * ohold;         // Object file list pointers
+       struct OHEADER * header;                                        // Output header pointer
 
-       textsize = datasize = bsssize = 0;                       // Initialise cumulative segment sizes
+       textsize = datasize = bsssize = 0;                      // Initialise cumulative segment sizes
 
-       // For each object file, accumulate the sizes of the segments but remove those 
-       // object files which are unused
-       oprev = NULL;                                            // Init previous obj file list ptr
-       otemp = olist;                                           // Set temp pointer to object file list
+       // For each object file, accumulate the sizes of the segments but remove
+       // those object files which are unused
+       oprev = NULL;                                                           // Init previous obj file list ptr
+       otemp = olist;                                                          // Set temp pointer to object file list
 
        while (otemp != NULL)
        {
@@ -1482,7 +1533,7 @@ struct OHEADER * make_ofile()
                        }
                }
 
-               otemp = otemp->o_next;                                // Go to next object file list pointer
+       otemp = otemp->o_next;                                          // Go to next object file list pointer
        }
 
        // Update base addresses and create symbols _TEXT_E, _DATA_E and _BSS_E
@@ -1502,7 +1553,7 @@ struct OHEADER * make_ofile()
                        ost_add("_BSS_E", 0x09000000, tval + textsize + datasize + bsssize);
                }
                else
-               { 
+               {
                        // BSS is independant of DATA
                        bbase = bval;
                        ost_add("_BSS_E", 0x09000000, bval + bsssize);
@@ -1528,11 +1579,11 @@ struct OHEADER * make_ofile()
                }
        }
 
-       // Place each unresolved symbol in the output symbol table 
+       // Place each unresolved symbol in the output symbol table
        if (dounresolved())
-               return NULL;                         
+               return NULL;
 
-       tptr = 0;                                                // Initialise base addresses
+       tptr = 0;                                                               // Initialise base addresses
        dptr = 0;
        bptr = 0;
 
@@ -1554,8 +1605,8 @@ struct OHEADER * make_ofile()
                        bptr += (otemp->o_header.bsize + secalign) & ~secalign;
                }
 
-               // For each symbol, (conditionally) add it to the ost 
-               // For ARCHIVE markers, this adds the symbol for the file & returns 
+               // For each symbol, (conditionally) add it to the ost
+               // For ARCHIVE markers, this adds the symbol for the file & returns
                if (dosym(otemp))
                        return NULL;
 
@@ -1599,7 +1650,7 @@ struct OHEADER * make_ofile()
        header->bsize = bsssize;                    // BSS segment size
        header->ssize = (ost_ptr - ost);            // Symbol table size
        header->ostbase = ost;                      // Output symbol table base address
-   
+
        // For each object file, relocate its TEXT and DATA segments. OR the result
        // into ret so all files get moved (and errors reported) before returning
        // with the error condition
@@ -1623,7 +1674,7 @@ struct OHEADER * make_ofile()
 //
 int add_to_hlist(struct HREC ** hptr, char * sym, struct OFILE * ofile, long value, int type)
 {
-       struct HREC * htemp;                                      // Temporary hash record pointer
+       struct HREC * htemp;                                    // Temporary hash record pointer
        int i;
 
        // Attempt to allocate new hash record
@@ -1633,15 +1684,21 @@ int add_to_hlist(struct HREC ** hptr, char * sym, struct OFILE * ofile, long val
                return 1;
        }
 
+       // Shamus: Moar testing...
+       if (vflag > 1)
+       {
+               printf("add_to_hlist(): hptr=$%08X, sym=\"%s\", ofile=$%08X, value=$%X, type=$%X\n", (unsigned int)hptr, sym, (unsigned int)ofile, value, type);
+       }
+
        for(i=0; i<SYMLEN; i++)
                htemp->h_sym[i] = '\0';
 
-       strcpy(htemp->h_sym, sym);                               // Populate hash record
+       strcpy(htemp->h_sym, sym);                              // Populate hash record
        htemp->h_ofile = ofile;
        htemp->h_value = value;
        htemp->h_type = type;
 
-       htemp->h_next = *hptr;                                   // Update hash record pointers
+       htemp->h_next = *hptr;                                  // Update hash record pointers
        *hptr = htemp;
 
        return 0;
@@ -1683,7 +1740,9 @@ struct HREC * lookup(char * sym)
 
        while (hptr != NULL)
        {
-               if (symcmp(symbol, hptr->h_sym))
+//This is utter failure...
+//             if (symcmp(symbol, hptr->h_sym))  <-- left here for giggles :D  - LinkoVitch
+               if (strcmp(symbol, hptr->h_sym) == 0)
                        return hptr;
 
                hptr = hptr->h_next;                                  // Return hash pointer if found
@@ -1703,7 +1762,7 @@ int hash_add(char * sym, long type, long value, struct OFILE * ofile)
 
        if (vflag > 1)
        {
-               printf("hash_add(%s,%s,%lx,", sym, ofile->o_name,value);
+               printf("hash_add(%s,%s,%lx,", sym, ofile->o_name, value);
                printf("%x,%s)\n", (unsigned int)type, (flag ? "GLOBAL" : "COMMON"));
        }
 
@@ -1715,10 +1774,10 @@ int hash_add(char * sym, long type, long value, struct OFILE * ofile)
        // Already there!
        if (iscommon(type) && !iscommon(hptr->h_type))
        {
-               // Mismatch: global came first; warn and keep the global one 
+               // Mismatch: global came first; warn and keep the global one
                if (wflag)
                {
-                       printf("Warning: %s: global from ",sym);
+                       printf("Warning: %s: global from ", sym);
                        put_name(hptr->h_ofile);
                        printf(" used, common from ");
                        put_name(ofile);
@@ -1730,7 +1789,7 @@ int hash_add(char * sym, long type, long value, struct OFILE * ofile)
        }
        else if (iscommon(hptr->h_type) && !iscommon(type))
        {
-               // Mismatch: common came first; warn and keep the global one 
+               // Mismatch: common came first; warn and keep the global one
                if (wflag)
                {
                        printf("Warning: %s: global from ", sym);
@@ -1744,9 +1803,10 @@ int hash_add(char * sym, long type, long value, struct OFILE * ofile)
                hptr->h_ofile = ofile;
                hptr->h_value = value;
        }
+       // They're both global
        else if (flag)
-       {                                                        // They're both global
-               // Global exported by another ofile; warn and make this one extern 
+       {
+               // Global exported by another ofile; warn and make this one extern
                if (wflag)
                {
                        printf("Duplicate symbol %s: ", sym);
@@ -1758,8 +1818,9 @@ int hash_add(char * sym, long type, long value, struct OFILE * ofile)
 
                putword(sym + 8, ABST_EXTERN);
        }
+       // They're both common
        else
-       {                                                                 // They're both common 
+       {
                if (hptr->h_value < value)
                {
                        hptr->h_value = value;
@@ -1775,7 +1836,7 @@ int hash_add(char * sym, long type, long value, struct OFILE * ofile)
 // Add the imported symbols from this file to unresolved, and the global and
 // common symbols to the exported hash table.
 //
-// Change old-style commons (type == T_EXTERN, value != 0) to new-style ones 
+// Change old-style commons (type == T_EXTERN, value != 0) to new-style ones
 // (type == (T_GLOBAL | T_EXTERN)).
 //
 int add_symbols(struct OFILE * Ofile)
@@ -1794,8 +1855,8 @@ int add_symbols(struct OFILE * Ofile)
                printf("Add symbols for file %s\n", Ofile->o_name);
 
        ptr = Ofile->o_image + 32                                // Get base pointer, start of sym fixups
-               + Ofile->o_header.tsize 
-               + Ofile->o_header.dsize 
+               + Ofile->o_header.tsize
+               + Ofile->o_header.dsize
                + Ofile->o_header.absrel.reloc.tsize
                + Ofile->o_header.absrel.reloc.dsize;
        sfix = ptr;                                              // Set symbol fixup pointer
@@ -1885,7 +1946,7 @@ int doobj(char * fname, char * ptr, char * aname, int flags)
        Ofile->o_bbase = 0;
        Ofile->o_flags = flags;
        Ofile->o_image = ptr;
-               
+
        // Don't do anything if this is just an ARCHIVE marker, just add the file to the olist
        if (!(flags & O_ARCHIVE))
        {
@@ -1896,8 +1957,8 @@ int doobj(char * fname, char * ptr, char * aname, int flags)
                Ofile->o_header.ssize = getlong(ptr+16);
                Ofile->o_header.absrel.reloc.tsize = getlong(ptr+24);
                Ofile->o_header.absrel.reloc.dsize = getlong(ptr+28);
-               
-               // Round BSS off to alignment boundary 
+
+               // Round BSS off to alignment boundary
                Ofile->o_header.bsize = (Ofile->o_header.bsize + secalign) & ~secalign;
 
                if (Ofile->o_header.dsize & 7)
@@ -1906,7 +1967,7 @@ int doobj(char * fname, char * ptr, char * aname, int flags)
                        put_name(Ofile);
                        printf(" is not a phrase multiple\n");
                }
-               
+
                // Check for odd segment sizes
                if ((Ofile->o_header.tsize & 1) || (Ofile->o_header.dsize & 1)
                        || (Ofile->o_header.bsize & 1))
@@ -1921,10 +1982,10 @@ int doobj(char * fname, char * ptr, char * aname, int flags)
                        return 1;
        }
 
-       // Add this file to the olist 
-       if (olist == NULL) 
+       // Add this file to the olist
+       if (olist == NULL)
                olist = Ofile;
-       else 
+       else
                olast->o_next = Ofile;
 
        olast = Ofile;
@@ -1945,7 +2006,7 @@ int dolist(void)
        // Process object file list
        while (plist != NULL)
        {
-               if (doobj(plist->o_name, plist->o_image, plist->o_arname, plist->o_flags)) 
+               if (doobj(plist->o_name, plist->o_image, plist->o_arname, plist->o_flags))
                        return 1;
 
                ptemp = plist;
@@ -1996,10 +2057,12 @@ int dolist(void)
 //
 char * path_tail(char * name)
 {
-       char * temp = max(strrchr(name,'/'), max(strrchr(name,':'), strrchr(name, 92)));
+//     char * temp = MAX(strrchr(name, '/'), MAX(strrchr(name, ':'), strrchr(name, '\\')));
+       char * temp = strrchr(name, PATH_DELIMITER);
 
+       // Return what was passed in if path delimiter was not found
        if (temp == NULL)
-               temp = (name - 1);
+               return name;
 
        return temp + 1;
 }
@@ -2011,35 +2074,35 @@ char * path_tail(char * name)
 int pladd(char * ptr, char * fname)
 {
        if (plist == NULL)
-       {  
-               plist = new_ofile();                                  // First time object record allocation
-               plast = plist;                                        // Update last object record pointer
+       {
+               plist = new_ofile();                                    // First time object record allocation
+               plast = plist;                                                  // Update last object record pointer
        }
        else
        {
-               plast->o_next = new_ofile();                          // Next object record allocation
-               plast = plast->o_next;                                // Update last object record pointer
+               plast->o_next = new_ofile();                    // Next object record allocation
+               plast = plast->o_next;                                  // Update last object record pointer
        }
 
        if (plast == NULL)
-       {                                
-               printf("Out of memory.\n");                           // Error if memory allocation fails
+       {
+               printf("Out of memory.\n");                             // Error if memory allocation fails
                return 1;
        }
 
-       if (strlen(path_tail(fname)) > FNLEN-1)
+       if (strlen(path_tail(fname)) > FNLEN - 1)
        {                 // Error on excessive filename length
                printf("File name too long: %s (sorry!)\n",fname);
                return 1;
        }
 
-       strcpy(plast->o_name, path_tail(fname));                 // Store filename, not path
-       *plast->o_arname = 0;                                    // No archive name for this file
-       plast->o_image = ptr;                                    // Store data pointer
-       plast->o_flags = O_USED;                                 // File is used
-       plast->o_next = NULL;                                    // Initialise next record pointer
+       strcpy(plast->o_name, path_tail(fname));        // Store filename, not path
+       *plast->o_arname = 0;                                           // No archive name for this file
+       plast->o_image = ptr;                                           // Store data pointer
+       plast->o_flags = O_USED;                                        // File is used
+       plast->o_next = NULL;                                           // Initialise next record pointer
 
-       return 0;                                               // Return without errors
+       return 0;                                                                       // Return without errors
 }
 
 
@@ -2058,7 +2121,7 @@ int pladd(char * ptr, char * fname)
 //
 int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
 {
-       long fsize, dsize, size;                                 // File, DATA segment and image sizes 
+       long fsize, dsize, size;                                 // File, DATA segment and image sizes
        char * ptr, * sptr;                                      // Data pointers
        int i;                                                   // Iterators
        int sym1len = 0;                                         // Symbol 1 length
@@ -2066,7 +2129,7 @@ int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
        unsigned symtype = 0;
 
        fsize = FSIZE(handle);                                   // Get size of include file
-       dsize = (fsize+secalign) & ~secalign;                     // Round up to a alignment boundary
+       dsize = (fsize + secalign) & ~secalign;                   // Round up to a alignment boundary
 
        sym1len = strlen(sym1) + 1;                              // Get sym1 length + null termination
        sym2len = strlen(sym2) + 1;                              // Get sym2 length + null termination
@@ -2083,7 +2146,7 @@ int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
        }
 
        // Read in binary data
-       if (read(handle, ptr+32, fsize) != fsize)
+       if (read(handle, ptr + 32, fsize) != fsize)
        {
                printf("File read error on %s\n", fname);
                close(handle);
@@ -2095,13 +2158,13 @@ int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
 
        strcpy(obj_fname[obj_index], path_tail(fname));
 
-       // Build this image's dummy header 
+       // Build this image's dummy header
        putlong(ptr, 0x00000107);                                // Magic number
 
        if (segment)
        {
-               putlong(ptr+4, dsize);                                // Text size 
-               putlong(ptr+8, 0L);                                   // Data size 
+               putlong(ptr+4, dsize);                                // Text size
+               putlong(ptr+8, 0L);                                   // Data size
                symtype = 0x05000000;
                obj_segsize[obj_index][0] = dsize;
                obj_segsize[obj_index][1] = 0;
@@ -2109,8 +2172,8 @@ int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
        }
        else
        {
-               putlong(ptr+4, 0L);                                   // Text size 
-               putlong(ptr+8, dsize);                                // Data size 
+               putlong(ptr+4, 0L);                                   // Text size
+               putlong(ptr+8, dsize);                                // Data size
                symtype = 0x07000000;
                obj_segsize[obj_index][0] = 0;
                obj_segsize[obj_index][1] = dsize;
@@ -2119,7 +2182,7 @@ int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
 
        obj_index++;                                             // Increment object count
 
-       putlong(ptr+12, 0L);                                     // BSS size 
+       putlong(ptr+12, 0L);                                     // BSS size
        putlong(ptr+16, 24);                                     // Symbol table size
        putlong(ptr+20, 0L);                                     // Entry point
        putlong(ptr+24, 0L);                                     // TEXT relocation size
@@ -2141,7 +2204,7 @@ int doinclude(char * fname, int handle, char * sym1, char * sym2, int segment)
        sptr = ptr + 32 + dsize + 24 + 4;                        // Set sptr to symbol table location
 
        for(i=0; i<(sym1len-1); i++)                             // Write symbol1 to string table
-               sptr[i] = *sym1++;     
+               sptr[i] = *sym1++;
 
        sptr += (sym1len-1);                                     // Step past symbol string
        *sptr = '\0';                                            // Terminate symbol string
@@ -2172,7 +2235,7 @@ int doobject(char * fname, int fd, char * ptr)
        long size;                                               // File size
 
        if (ptr == NULL)
-       {                                        
+       {
                size = FSIZE(fd);                                     // Get size of input object file
 
                // Allocate memory for file data
@@ -2199,9 +2262,9 @@ int doobject(char * fname, int fd, char * ptr)
                obj_index++;
 
                close(fd);                                            // Close file
-       }    
+       }
 
-       // Now add this image to the list of pending ofiles (plist) 
+       // Now add this image to the list of pending ofiles (plist)
        // This routine is shared by doinclude after it builds the image
        return pladd(ptr, fname);
 }
@@ -2234,14 +2297,14 @@ int flush_handles(void)
                                close(handle[i]);                               // Close file and error
                                return 1;
                        }
-               
-                       lseek(handle[i], 0L, 0);                           // Reset to start of input file 
+
+                       lseek(handle[i], 0L, 0);                           // Reset to start of input file
        //              test = getlong(magic); printf("Magic Number is 0x%08X\n", test);
 
                        if (getlong(magic) == 0x00000107)
                        {                 // Look for SMAC/MAC object files
                                if (doobject(name[i], handle[i], 0L))            // Process input object file
-                                       return 1; 
+                                       return 1;
                        }
                        else
                        {
@@ -2254,7 +2317,7 @@ int flush_handles(void)
                {
                        // INCLUDE FILES
                        // If hflag[i] is 1, include this in the data segment; if 2, put in in text segment
-                       if (doinclude(name[i], handle[i], hsym1[i], hsym2[i], hflag[i] - 1)) 
+                       if (doinclude(name[i], handle[i], hsym1[i], hsym2[i], hflag[i] - 1))
                                return 1;
                }
        }
@@ -2262,7 +2325,7 @@ int flush_handles(void)
        // Free include, symbol & object handles
        for(i=0; i<(int)hd; i++)
        {
-               free(name[i]); 
+               free(name[i]);
 
                if (hflag[i])
                {
@@ -2370,7 +2433,7 @@ int docmdfile(char * fname)
 
        // Attempt to open and read in the command file
        if (fname)
-       { 
+       {
                if ((fd = open(fname, _OPEN_FLAGS)) < 0)
                {
                        printf("Cannot open command file %s.\n", fname);
@@ -2427,278 +2490,285 @@ int docmdfile(char * fname)
 //
 int doargs(int argc, char * argv[])
 {
-   int i = 1;                                               // Iterator
-   int c;                                                   // Command line character
-   char * ifile, * isym;                                        // File name and symbol name for -i 
-
-   while (i < argc)
-   {                                        // Parse through option switches & files
-      if (argv[i][0] == '-')
-         {                               // Process command line switches
-         if (!argv[i][1])
-                { 
-            printf("Illegal option argument: %s\n\n", argv[i]);
-            display_help();
-                     return 1;
-         }
-
-         c = argv[i++][1];                                  // Get next character in command line
-
-         switch (c)
-                {                                        // Process command line switch
-            case '?':                                       // Display usage information
-            case 'h':
+       int i = 1;                                               // Iterator
+       int c;                                                   // Command line character
+       char * ifile, * isym;                                    // File name and symbol name for -i
+
+       while (i < argc)
+       {                                        // Parse through option switches & files
+               if (argv[i][0] == '-')
+               {                               // Process command line switches
+                       if (!argv[i][1])
+                       {
+                               printf("Illegal option argument: %s\n\n", argv[i]);
+                               display_help();
+                               return 1;
+                       }
+
+                       c = argv[i++][1];                                  // Get next character in command line
+
+                       switch (c)
+                       {                                        // Process command line switch
+                       case '?':                                       // Display usage information
+                       case 'h':
                        case 'H':
-               display_version();
-               display_help();
-               return 1;
-            case 'a':
-                       case 'A':                                  // Set absolute linking on 
-               if (aflag)
-                                  warn('a', 1);
-
-                          if (i + 2 >= argc)
-                          {
-                  printf("Not enough arguments to -a\n");
-                  return 1;
-               }
-
-               aflag = 1;                                   // Set abs link flag
-               // Segment order is TEXT, DATA, BSS
-               // Text segment can be 'r', 'x' or a value 
-               ttype = 0;
-
-                          if ((*argv[i] == 'r' || *argv[i] == 'R') && !argv[i][1])
-                          {
-                  ttype = -1;                               // TEXT segment is relocatable
-               }
-               else if ((*argv[i] == 'x' || *argv[i] == 'X'))
-                          {
-                  printf("Error in text-segment address: cannot be contiguous\n");
-                  return 1;
-               }
-               else if ((ttype = 0), getval(argv[i], &tval))
-                          {
-                  printf("Error in text-segment address: %s is not 'r', 'x' or an address.", argv[i]);
-                  return 1;
-               }
-
-               i++;
-               // Data segment can be 'r', 'x' or a value 
-               dtype = 0;
-
-                          if ((*argv[i] == 'r' || *argv[i] == 'R') && !argv[i][1])
-                          {
-                  dtype = -1;                               // DATA segment is relocatable
-               }
-               else if ((*argv[i] == 'x' || *argv[i] == 'X'))
-                          {
-                  dtype = -2;                               // DATA follows TEXT
-               }
-               else if ((dtype = 0), getval(argv[i],&dval))
-                          {
-                  printf("Error in data-segment address: %s is not 'r', 'x' or an address.", argv[i]);
-                  return 1;
-               }
-
-               i++;
-               btype = 0;
-
-                          // BSS segment can be 'r', 'x' or a value 
-               if ((*argv[i] == 'r' || *argv[i] == 'R') && !argv[i][1])
-                          {
-                  btype = -1;                               // BSS segment is relocatable
-               }
-               else if ((*argv[i] == 'x' || *argv[i] == 'X'))
-                          {
-                  btype = -3;                               // BSS follows DATA
-               }
-               else if ((btype = 0), getval(argv[i],&bval))
-                          {
-                  printf("Error in bss-segment address: %s is not 'r', 'x[td]', or an address.", argv[i]);
-                  return 1;
-               }
-
-               i++;
-               break;
-            case 'b':
+                               display_version();
+                               display_help();
+                               return 1;
+                       case 'a':
+                       case 'A':                                  // Set absolute linking on
+                               if (aflag)
+                                       warn('a', 1);
+
+                               if (i + 2 >= argc)
+                               {
+                                       printf("Not enough arguments to -a\n");
+                                       return 1;
+                               }
+
+                               aflag = 1;                                   // Set abs link flag
+                               // Segment order is TEXT, DATA, BSS
+                               // Text segment can be 'r', 'x' or a value
+                               ttype = 0;
+
+                               if ((*argv[i] == 'r' || *argv[i] == 'R') && !argv[i][1])
+                               {
+                                       ttype = -1;                               // TEXT segment is relocatable
+                               }
+                               else if ((*argv[i] == 'x' || *argv[i] == 'X'))
+                               {
+                                       printf("Error in text-segment address: cannot be contiguous\n");
+                                       return 1;
+                               }
+                               else if ((ttype = 0), getval(argv[i], &tval))
+                               {
+                                       printf("Error in text-segment address: %s is not 'r', 'x' or an address.", argv[i]);
+                                       return 1;
+                               }
+
+                               i++;
+                               // Data segment can be 'r', 'x' or a value
+                               dtype = 0;
+
+                               if ((*argv[i] == 'r' || *argv[i] == 'R') && !argv[i][1])
+                               {
+                                       dtype = -1;                               // DATA segment is relocatable
+                               }
+                               else if ((*argv[i] == 'x' || *argv[i] == 'X'))
+                               {
+                                       dtype = -2;                               // DATA follows TEXT
+                               }
+                               else if ((dtype = 0), getval(argv[i],&dval))
+                               {
+                                       printf("Error in data-segment address: %s is not 'r', 'x' or an address.", argv[i]);
+                                       return 1;
+                               }
+
+                               i++;
+                               btype = 0;
+
+                               // BSS segment can be 'r', 'x' or a value
+                               if ((*argv[i] == 'r' || *argv[i] == 'R') && !argv[i][1])
+                               {
+                                       btype = -1;                               // BSS segment is relocatable
+                               }
+                               else if ((*argv[i] == 'x' || *argv[i] == 'X'))
+                               {
+                                       btype = -3;                               // BSS follows DATA
+                               }
+                               else if ((btype = 0), getval(argv[i],&bval))
+                               {
+                                       printf("Error in bss-segment address: %s is not 'r', 'x[td]', or an address.", argv[i]);
+                                       return 1;
+                               }
+
+                               i++;
+                               break;
+                       case 'b':
                        case 'B':                                  // Don't remove muliply defined locals
-               if (bflag)
-                                  warn('b', 1);
+                               if (bflag)
+                                       warn('b', 1);
 
-                          bflag = 1;
-               break;
-            case 'c':
+                               bflag = 1;
+                               break;
+                       case 'c':
                        case 'C':                             // Process a command file
-               if (i == argc)
-                          {
-                  printf("Not enough arguments to -c\n");
-                  return 1;
-               }
-
-               if (docmdfile(argv[i++]))
-                          {
-                  return 1;
-               }
-
-               break;
-            case 'd':
-                       case 'D':                                  // Wait for "return" before exiting 
-               if (dflag)
-                                  warn('d', 0);
-
-                          dflag = 1;
-               waitflag = 1;
-               break;
-            case 'e':
+                               if (i == argc)
+                               {
+                                       printf("Not enough arguments to -c\n");
+                                       return 1;
+                               }
+
+                               if (docmdfile(argv[i++]))
+                               {
+                                       return 1;
+                               }
+
+                               break;
+                       case 'd':
+                       case 'D':                                  // Wait for "return" before exiting
+                               if (dflag)
+                                       warn('d', 0);
+
+                               dflag = 1;
+                               waitflag = 1;
+                               break;
+                       case 'e':
                        case 'E':                             // Output COFF (absolute only)
-               cflag = 1;
-               break;
-            case 'g':
+                               cflag = 1;
+                               break;
+                       case 'g':
                        case 'G':                             // Output source level debugging
-               printf("\'g\' flag not currently implemented\n");
-               gflag = 0;
-               /*
-               if (gflag) warn('g', 1);
-               gflag = 1;
-               */
-               break;
-            case 'i':
+                               printf("\'g\' flag not currently implemented\n");
+                               gflag = 0;
+                               /*
+                               if (gflag) warn('g', 1);
+                               gflag = 1;
+                               */
+                               break;
+                       case 'i':
                        case 'I':                             // Include binary file
-               if (i + 2 > argc)
-                          {
-                  printf("Not enough arguments to -i\n");
-                  return 1;
-               }
-
-               ifile = argv[i++];
-               isym = argv[i++];
-                          
-               if ((argv[i-3][2] == 'i') || (argv[i-3][2] == 'I'))
-                          {   // handle -ii (No truncation)
-                  if (!cflag)
-                                         printf("warning: (-ii) COFF format output not specified\n");
-               }
-               else
-                          {                                     // handle -i (Truncation)
-                  if (strlen(isym) > 7)
-                                         isym[7] = '\0';
-               }
-
-               // Place include files in the DATA segment only
-               if (dofile(ifile, DSTSEG_D, isym))
-                                  return 1;
-
-                          break;
-            case 'l':
+                               if (i + 2 > argc)
+                               {
+                                       printf("Not enough arguments to -i\n");
+                                       return 1;
+                               }
+
+                               ifile = argv[i++];
+                               isym = argv[i++];
+
+                               if ((argv[i-3][2] == 'i') || (argv[i-3][2] == 'I'))
+                               {   // handle -ii (No truncation)
+                                       if (!cflag)
+                                               printf("warning: (-ii) COFF format output not specified\n");
+                               }
+                               else
+                               {                                     // handle -i (Truncation)
+                                       if (strlen(isym) > 7)
+                                               isym[7] = '\0';
+                               }
+
+                               // Place include files in the DATA segment only
+                               if (dofile(ifile, DSTSEG_D, isym))
+                                       return 1;
+
+                               break;
+                       case 'l':
                        case 'L':                             // Add local symbols
-               if (lflag)
-                                  warn('l', 1);
+                               if (lflag)
+                                       warn('l', 1);
 
-                          lflag = 1;
-               break;
-            case 'm':
+                               lflag = 1;
+                               break;
+                       case 'm':
                        case 'M':                             // Produce load symbol map
-               if (mflag)
-                                  warn('m', 1);
+                               if (mflag)
+                                       warn('m', 1);
 
-                          mflag = 1;
-               break;
-            case 'n':
+                               mflag = 1;
+                               break;
+                       case 'n':
                        case 'N':                             // Output no header to .abs file
-               if (noheaderflag)
-                                  warn('n', 1);
-
-                          noheaderflag = 1;
-               break;
-            case 'o':
-                       case 'O':                                  // Specify an output file 
-               if (oflag)
-                                  warn('o', 1);
-
-                          oflag = 1;
-
-                          if (i >= argc)
-                          {
-                  printf("No output filename following -o switch\n");
-                  return 1;
-               }
-
-               if (strlen(argv[i]) > FARGSIZE - 5)
-                          {
-                  printf("Output file name too long (sorry!)\n");
-                  return 1;
-               }
-
-               strcpy(ofile, argv[i++]);
-               break;
-            case 'r':
+                               if (noheaderflag)
+                                       warn('n', 1);
+
+                               noheaderflag = 1;
+                               break;
+                       case 'o':
+                       case 'O':                                  // Specify an output file
+                               if (oflag)
+                                       warn('o', 1);
+
+                               oflag = 1;
+
+                               if (i >= argc)
+                               {
+                                       printf("No output filename following -o switch\n");
+                                       return 1;
+                               }
+
+                               if (strlen(argv[i]) > FARGSIZE - 5)
+                               {
+                                       printf("Output file name too long (sorry!)\n");
+                                       return 1;
+                               }
+
+                               strcpy(ofile, argv[i++]);
+                               break;
+                       case 'r':
                        case 'R':                             // Section alignment size
-               if (rflag)
-                                  warn('r', 1);
-
-                          rflag = 1;
-
-                          switch (argv[i-1][2])
-                          {
-                  case 'w': case 'W': secalign = 1;  break; // Word alignment
-                  case 'l': case 'L': secalign = 3;  break; // Long alignment
-                  case 'p': case 'P': secalign = 7;  break; // Phrase alignment
-                  case 'd': case 'D': secalign = 15; break; // Double phrase alignment
-                  case 'q': case 'Q': secalign = 31; break; // Quad phrase alignment
-                  default:            secalign = 7;  break; // Default phrase alignment
-               }
-
-               break;
-            case 's':
+                               if (rflag)
+                                       warn('r', 1);
+
+                               rflag = 1;
+
+                               switch (argv[i-1][2])
+                               {
+                                       case 'w': case 'W': secalign = 1;  break; // Word alignment
+                                       case 'l': case 'L': secalign = 3;  break; // Long alignment
+                                       case 'p': case 'P': secalign = 7;  break; // Phrase alignment
+                                       case 'd': case 'D': secalign = 15; break; // Double phrase alignment
+                                       case 'q': case 'Q': secalign = 31; break; // Quad phrase alignment
+                                       default:            secalign = 7;  break; // Default phrase alignment
+                               }
+
+                               break;
+                       case 's':
                        case 'S':                             // Output only global symbols
-               if (sflag)
-                                  warn('s', 1);
+                               if (sflag)
+                                       warn('s', 1);
 
-                          sflag = 1;
-               break;
-            case 'v':
+                               sflag = 1;
+                               break;
+                       case 'v':
                        case 'V':                                  // Verbose information
-               if (!vflag && !versflag)
-                          {
-                  display_version();
-               }
-
-               vflag++;
-               break;
-            case 'z':
-                       case 'Z':                                  // Suppress banner flag 
-               if (zflag)
-                                  warn('z', 1);
-
-                          zflag = 1;
-               break;
-            default:
-               printf("unknown option argument `%c'\n", c);
-               return 1;
-         }
-      }
-      else
-         {                                              // Not a switch, then process as a file
-         if (dofile(argv[i++], 0, NULL))
-                        return 1;
-      }
-
-   }
-
-   if (!oflag && vflag)
-   {
-      strcpy(ofile, "output");
-      printf("Output file is %s[.ext]\n", ofile);
-   }
-
-   if (oflag && vflag)
-          printf("Output file is %s\n", ofile);
-
-   if (sflag)
-          lflag = 0;
-
-   return 0;                                               // No problems encountered
+                               if (!vflag && !versflag)
+                               {
+                                       display_version();
+                               }
+
+                               vflag++;
+                               break;
+                       case 'w':
+                       case 'W':                                  // Show warnings flag
+                               if (wflag)
+                                       warn('w', 1);
+
+                               wflag = 1;
+                               break;
+                       case 'z':
+                       case 'Z':                                  // Suppress banner flag
+                               if (zflag)
+                                       warn('z', 1);
+
+                               zflag = 1;
+                               break;
+                       default:
+                               printf("unknown option argument `%c'\n", c);
+                               return 1;
+                       }
+               }
+               else
+               {                                              // Not a switch, then process as a file
+                       if (dofile(argv[i++], 0, NULL))
+                               return 1;
+               }
+
+       }
+
+       if (!oflag && vflag)
+       {
+               strcpy(ofile, "output");
+               printf("Output file is %s[.ext]\n", ofile);
+       }
+
+       if (oflag && vflag)
+               printf("Output file is %s\n", ofile);
+
+       if (sflag)
+               lflag = 0;
+
+       return 0;                                               // No problems encountered
 }
 
 
@@ -2709,8 +2779,8 @@ void display_version(void)
 {
        if (displaybanner)// && vflag)
        {
-               printf("\nReboot's Linker for Atari Jaguar\n"); 
-               printf("Copyright (c) 199x Allan K. Pratt, 2011 Reboot\n"); 
+               printf("\nReboot's Linker for Atari Jaguar\n");
+               printf("Copyright (c) 199x Allan K. Pratt, 2011 Reboot\n");
                printf("V%i.%i.%i %s (%s)\n\n", MAJOR, MINOR, PATCH, __DATE__, PLATFORM);
        }
 }
@@ -2748,6 +2818,7 @@ void display_help(void)
        printf("                           q: quad phrase (32 bytes)\n");
        printf("   -s                      output only global symbols\n");
        printf("   -v                      set verbose mode\n");
+       printf("   -w                      show linker warnings\n");
        printf("   -z                      suppress banner\n");
        printf("\n");
 }
@@ -2767,7 +2838,7 @@ void rln_exit(void)
        // Wait for return key if requested
        if (waitflag)
        {
-               printf("\nPress the <return> key to continue. ");
+               printf("\nPress the [RETURN] key to continue. ");
                fgets(tempbuf, 128, stdin);
        }
 
@@ -2784,9 +2855,9 @@ int get_endianess(void)
        char * p = (char *)&i;
 
        if (p[0] == 1)
-               return 0;               // LITTLE
+               return ENDIANNESS_LITTLE;
 
-       return 1;                       // BIG
+       return ENDIANNESS_BIG;
 }
 
 
@@ -2796,7 +2867,7 @@ int get_endianess(void)
 int main(int argc, char * argv[])
 {
        char * s = NULL;                            // String pointer for "getenv"
-       struct HREC * utemp;                        // Temporary hash record pointer 
+       struct HREC * utemp;                        // Temporary hash record pointer
        struct OHEADER * header;                    // Pointer to output header structure
 
        endian = get_endianess();                   // Get processor endianess
@@ -2816,7 +2887,7 @@ int main(int argc, char * argv[])
        if (!zflag && !vflag)
        {
                display_version();                      // Display version information
-               versflag = 1;                           // We've dumped the version banner 
+               versflag = 1;                           // We've dumped the version banner
        }
 
        // Process in specified files/objects
@@ -2847,7 +2918,7 @@ int main(int argc, char * argv[])
        {
                printf("UNRESOLVED SYMBOLS\n");
 
-               // Don't list them if two -u's or more 
+               // Don't list them if two -u's or more
                if (uflag < 2)
                {
                        utemp = unresolved;
@@ -2895,9 +2966,9 @@ int main(int argc, char * argv[])
                        printf("Absolute linking ");
 
                        if (cflag)
-                       printf("(COF)\n"); 
+                               printf("(COF)\n"); 
                        else
-                       printf("(ABS)\n");
+                               printf("(ABS)\n");
                }
 
                if (vflag > 1)
@@ -2922,6 +2993,8 @@ int main(int argc, char * argv[])
                printf("+---------+----------+----------+----------+\n\n");
        }
 
+//printf("BIG_ENDIAN = %i, LITTLE_ENDIAN = %i\n", BIG_ENDIAN, LITTLE_ENDIAN);
+
        free(header);                               // Free allocated memory
        rln_exit();                                 // Perform application exit
 }