X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rln;a=blobdiff_plain;f=rln.c;h=5b3323255551eccfde37216b5e8ce06998fbf5fc;hp=94e2416ef45250e412ebc9b918b3a6fd0bec0e7a;hb=9ab479822c5e31c7cee4cad1496b562b42ee374b;hpb=ed794c04e7961bdec9e1051a2224fde544e0ff95 diff --git a/rln.c b/rln.c index 94e2416..5b33232 100644 --- a/rln.c +++ b/rln.c @@ -1,7 +1,6 @@ // -// RLN - Reboot's Linker for the Atari Jaguar Console System -// RLN.C - Application Code -// Copyright (C) 199x, Allan K. Pratt, 2014 Reboot & Friends +// RLN - Reboot's Linker for the Atari Jaguar console system +// Copyright (C) 199x, Allan K. Pratt, 2014-2015 Reboot & Friends // #include "rln.h" @@ -34,9 +33,7 @@ unsigned dataoffset = 0; // COF DATA segment offset unsigned bssoffset = 0; // COF BSS segment offset unsigned displaybanner = 1; // Display version banner unsigned symoffset = 0; // Symbol table offset in output file -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 @@ -54,9 +51,6 @@ 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[16384][FNLEN]; // Object file names -unsigned obj_segsize[16384][3]; // Object file seg sizes; TEXT,DATA,BSS -unsigned obj_index = 0; // Object file index/count char * arPtr[512]; uint32_t arIndex = 0; struct HREC * htable[NBUCKETS]; // Hash table @@ -132,32 +126,6 @@ long FileSize(int fd) } -// -// Debugging detritus -// -void DumpOListAndObjSegSizeList(void) -{ - struct OFILE * o; - int i; - - printf("Object list order:\n"); - - for(o=olist; o!=NULL; o=o->o_next) - { - printf("\t%s\n", o->o_name); - } - - printf("\nobj_segsize[][] list order:\n"); - - for(i=0; i<(int)obj_index; i++) - { - printf("\t%s\n", obj_fname[i]); - } - - printf("\n"); -} - - // // For this object file, add symbols to the output symbol table after // relocating them. Returns TRUE if OSTLookup returns an error (-1). @@ -169,9 +137,7 @@ int DoSymbols(struct OFILE * ofile) int index; int j; struct HREC * hptr; - unsigned tsoSave, dsoSave, bsoSave; - -// DumpOListAndObjSegSizeList(); + uint32_t tsoSave, dsoSave, bsoSave; // Point to first symbol record in the object file char * symptr = (ofile->o_image + 32 @@ -183,37 +149,9 @@ int DoSymbols(struct OFILE * ofile) // Point to end of symbol record in the object file char * symend = symptr + ofile->o_header.ssize; - // Search through object segment size table to accumulated segment sizes to - // ensure the correct offsets are used in the resulting COF file. - int ssidx = -1; - unsigned tsegoffset = 0, dsegoffset = 0, bsegoffset = 0; - - // Search for object file name - for(j=0; j<(int)obj_index; j++) - { - if (!strcmp(ofile->o_name, obj_fname[j])) - { - // Object file name found - ssidx = j; - break; - } - - // Accumulate segment sizes -// N.B. We can get rid of this now that there is a spot in the OFILE for these. -// Just have to make sure that the order that the linked list is in -// corresponds to the order shown here... -// I've proved to my satisfaction that the orders are the same...! - tsegoffset += obj_segsize[j][0]; - dsegoffset += obj_segsize[j][1]; - bsegoffset += obj_segsize[j][2]; - } - - if (ssidx == -1) - { - printf("DoSymbols(): Object file missing from obj_fname: %s\n", - ofile->o_name); - return 1; - } + uint32_t tsegoffset = ofile->segBase[TEXT]; + uint32_t dsegoffset = ofile->segBase[DATA]; + uint32_t bsegoffset = ofile->segBase[BSS]; // Save segment vars, so we can restore them if needed tsoSave = tsegoffset, dsoSave = dsegoffset, bsoSave = bsegoffset; @@ -256,42 +194,14 @@ int DoSymbols(struct OFILE * ofile) continue; } - // 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; - tsegoffset = dsegoffset = bsegoffset = 0; - - // Search for object filename - for(j=0; j<(int)obj_index; j++) - { - if (!strcmp(hptr->h_ofile->o_name, obj_fname[j])) - { - ssidx = j; // Symbol object filename - break; - } - - // Accumulate segment sizes - tsegoffset += obj_segsize[j][0]; - dsegoffset += obj_segsize[j][1]; - bsegoffset += obj_segsize[j][2]; - } - - if (ssidx == -1) - { - printf("DoSymbols(): Object file missing from obj_fname: '%s:%s' symbol: '%s' (%s)\n", - hptr->h_ofile->o_name, hptr->h_ofile->o_arname, - symend + index, ofile->o_name); - return 1; - } + tsegoffset = hptr->h_ofile->segBase[TEXT]; + dsegoffset = hptr->h_ofile->segBase[DATA]; + bsegoffset = hptr->h_ofile->segBase[BSS]; // Update type with global type type = hptr->h_type; - // Remove external flag if absolute + // Remove global flag if absolute if (type == (T_GLBL | T_ABS)) type = T_ABS; @@ -326,15 +236,19 @@ int DoSymbols(struct OFILE * ofile) // Process and update the value dependent on whether the symbol is a // debug symbol or not - // N.B.: These are currently not supported + // N.B.: Debug symbols are currently not supported if (type & 0xF0000000) { // DEBUG SYMBOL // Set the correct debug symbol base address (TEXT segment) +#if 0 dbgsymbase = 0; for(j=0; (unsigned)jsegBase[TEXT]; +#endif switch (type & 0xFF000000) { @@ -405,9 +319,6 @@ int DoSymbols(struct OFILE * ofile) } } - // Increment dosymi processsing - dosymi++; - return 0; } @@ -1127,7 +1038,7 @@ int WriteOutputFile(struct OHEADER * header) struct OFILE * otemp; // Object file pointer int i, j; // Iterators char himage[0x168]; // Header image (COF = 0xA8) - unsigned tsoff, dsoff, bsoff; // Segment offset values + uint32_t tsoff, dsoff, bsoff; // Segment offset values unsigned index, type, value; // Symbol table index, type and value short abstype; // ABS symbol type char symbol[14]; // Symbol record for ABS files @@ -1162,10 +1073,10 @@ int WriteOutputFile(struct OHEADER * header) // 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++) + for(otemp=olist; otemp!=NULL; otemp=otemp->o_next) { - dsoff += obj_segsize[i][0]; // Adding TEXT segment sizes - bsoff += obj_segsize[i][0] + obj_segsize[i][1]; // Adding TEXT and DATA segment sizes + dsoff += otemp->segSize[TEXT]; + bsoff += otemp->segSize[TEXT] + otemp->segSize[DATA]; } // Currently this only builds a COF absolute file. Conditionals and @@ -1368,8 +1279,8 @@ int WriteOutputFile(struct OHEADER * header) case 0x08000000: abstype = (short)ABST_DEFINED | ABST_BSS; break; case 0x09000000: abstype = (short)ABST_DEFINED | ABST_GLOBAL | ABST_BSS; break; default: - printf("warning (WriteOutputFile): ABS, cannot determine symbol type ($%08X)\n", type); - type = 0; + printf("warning (WriteOutputFile): ABS, cannot determine symbol type ($%08X) [%s]\n", type, symbol); +// type = 0; break; } @@ -1383,10 +1294,9 @@ int WriteOutputFile(struct OHEADER * header) } } - // Close the file if (fclose(fd)) { - printf("Close error on output file %s\n",ofile); + printf("Close error on output file %s\n", ofile); return 1; } @@ -1540,9 +1450,9 @@ int GetHexValue(char * string, int * value) // Create one big .o file from the images already in memory, returning a // pointer to an OHEADER. Note that the oheader is just the header for the // output (plus some other information). The text, data, and fixups are all -// still in the ofile images hanging off the global `olist'. +// still in the ofile images hanging off the global 'olist'. // -struct OHEADER * MakeOutputFile() +struct OHEADER * MakeOutputObject() { unsigned tptr, dptr, bptr; // Bases in runtime model int ret = 0; // Return value @@ -1555,65 +1465,45 @@ struct OHEADER * MakeOutputFile() // those object files which are unused struct OFILE * oprev = NULL; // Init previous obj file list ptr struct OFILE * otemp = olist; // Set temp pointer to object file list - int i = 0; while (otemp != NULL) { - // UNUSED !!!!! (it's !O_ARCHIVE, so this code executes.) - if (!(otemp->o_flags & O_ARCHIVE)) + // If the object is unused, discard it... + if ((otemp->o_flags & O_USED) == 0) { - if ((otemp->o_flags & O_USED) == 0) + if (wflag) { - if (wflag) - { - printf("Unused object file "); - WriteARName(otemp); - printf(" discarded.\n"); - } - - // Drop the entry from the linked list - if (oprev == NULL) - olist = otemp->o_next; - else - oprev->o_next = otemp->o_next; - - // Free the object entry if it's not an archive file - if (!otemp->isArchiveFile) - free(otemp->o_image); - - // Also need to remove them from the obj_* tables too :-P - // N.B.: Would probably be worthwhile to remove crap like this - // and stuff it into the OFILE structure... - if (wflag) - printf("»-> removing %s... (index == %i, len == %i)\n", obj_fname[i], i, obj_index - 1); + printf("Unused object file "); + WriteARName(otemp); + printf(" discarded.\n"); + } - int k; + // Drop the entry from the linked list + if (oprev == NULL) + olist = otemp->o_next; + else + oprev->o_next = otemp->o_next; - for(k=i; kisArchiveFile) + free(otemp->o_image); + } + else + { + // Save accumulated addresses in the object + otemp->segBase[TEXT] = textsize; + otemp->segBase[DATA] = datasize; + otemp->segBase[BSS] = bsssize; - obj_index--; - i--; - } - else - { - // Increment total of segment sizes ensuring requested - // alignment - textsize += (otemp->o_header.tsize + secalign) & ~secalign; - datasize += (otemp->o_header.dsize + secalign) & ~secalign; - bsssize += (otemp->o_header.bsize + secalign) & ~secalign; - oprev = otemp; - } + // Increment total of segment sizes ensuring requested alignment + textsize += (otemp->o_header.tsize + secalign) & ~secalign; + datasize += (otemp->o_header.dsize + secalign) & ~secalign; + bsssize += (otemp->o_header.bsize + secalign) & ~secalign; + oprev = otemp; } // Go to next object file list pointer otemp = otemp->o_next; - i++; } // Update base addresses and inject the symbols _TEXT_E, _DATA_E and _BSS_E @@ -1634,7 +1524,7 @@ struct OHEADER * MakeOutputFile() } else { - // DATA is independant of TEXT + // DATA is independent of TEXT dbase = dval; if (!bval) @@ -1645,6 +1535,7 @@ struct OHEADER * MakeOutputFile() bbase = bval; } + // Inject segment end labels, for C compilers that expect this shite OSTAdd("_TEXT_E", 0x05000000, tbase + textsize); OSTAdd("_DATA_E", 0x07000000, dbase + datasize); OSTAdd("_BSS_E", 0x09000000, bbase + bsssize); @@ -1666,16 +1557,11 @@ struct OHEADER * MakeOutputFile() while (otemp != NULL) { otemp->o_tbase = tptr; - - // Do rest only for non-ARCHIVE markers - if (!(otemp->o_flags & O_ARCHIVE)) - { - otemp->o_dbase = dptr; - otemp->o_bbase = bptr; - tptr += (otemp->o_header.tsize + secalign) & ~secalign; - dptr += (otemp->o_header.dsize + secalign) & ~secalign; - bptr += (otemp->o_header.bsize + secalign) & ~secalign; - } + otemp->o_dbase = dptr; + otemp->o_bbase = bptr; + tptr += (otemp->o_header.tsize + secalign) & ~secalign; + dptr += (otemp->o_header.dsize + secalign) & ~secalign; + 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 @@ -1684,27 +1570,8 @@ struct OHEADER * MakeOutputFile() if (DoSymbols(otemp)) return NULL; - if (otemp->o_flags & O_ARCHIVE) - { - struct OFILE * oNext = otemp->o_next; - - // Now that the archive is marked, remove it from list - if (oprev == NULL) - olist = otemp->o_next; - else - oprev->o_next = otemp->o_next; - - if (otemp->o_image && !otemp->isArchiveFile) - free(otemp->o_image); - - free(otemp); - otemp = oNext; - } - else - { - oprev = otemp; - otemp = otemp->o_next; - } + oprev = otemp; + otemp = otemp->o_next; } // Places all the externs, globals etc into the output symbol table @@ -1716,7 +1583,7 @@ struct OHEADER * MakeOutputFile() if (header == NULL) { - printf("MakeOutputFile: out of memory!\n"); + printf("MakeOutputObject: out of memory!\n"); return NULL; } @@ -1734,11 +1601,8 @@ struct OHEADER * MakeOutputFile() // with the error condition for(otemp=olist; otemp!=NULL; otemp=otemp->o_next) { - if (!(otemp->o_flags & O_ARCHIVE)) - { - ret |= RelocateSegment(otemp, T_TEXT); // TEXT segment relocations - ret |= RelocateSegment(otemp, T_DATA); // DATA segment relocations - } + ret |= RelocateSegment(otemp, T_TEXT); // TEXT segment relocations + ret |= RelocateSegment(otemp, T_DATA); // DATA segment relocations } // Done with global symbol hash tables @@ -1900,24 +1764,6 @@ struct HREC * LookupARHREC(char * symbol) } -// -// Find the index in the obj_segsize table for the passed in filename -// -int GetObjSegSizeIndex(char * name) -{ - int i; - - for(i=0; i<(int)obj_index; i++) - { - if (strcmp(name, obj_fname[i]) == 0) - // Object file name was found! - return i; - } - - return -1; -} - - // // Add the imported symbols from this file to unresolved, and the global and // common (???) symbols to the exported hash table. @@ -1970,8 +1816,7 @@ int AddSymbols(struct OFILE * Ofile) } else if (type == T_GLBL) { - // External symbol that is *not* in the current unit - // N.B.: Also, could be common symbol *in* current unit...! + // Global symbol that may or may not be in the current unit hptr = LookupHREC(sstr + index); if (hptr != NULL) @@ -1979,27 +1824,21 @@ int AddSymbols(struct OFILE * Ofile) // Otherwise, *maybe* add to unresolved list else { - // Check to see if this is a common symbol; if so, try to add - // it to the hash list... + // Check to see if this is a common symbol; if so, add it to + // the hash list... if (value != 0) { // Actually, we need to convert this to a BSS symbol, // increase the size of the BSS segment for this object, & // add it to the hash list - uint32_t valueSave = value; uint32_t bssLocation = Ofile->o_header.tsize + Ofile->o_header.dsize + Ofile->o_header.bsize; Ofile->o_header.bsize += value; + Ofile->segSize[BSS] += value; type |= T_BSS; value = bssLocation; PutLong(sfix + 4, type); PutLong(sfix + 8, value); - // Also need to reset the size of the object's BSS section: - int i = GetObjSegSizeIndex(Ofile->o_name); -//printf("AddSymbols: obj_segsize[%i][BSS] = %d (value = %d)\n", i, obj_segsize[i][BSS], value); - obj_segsize[i][BSS] += valueSave; // need to realign the section, but only *after* all the common symbols have been added from this unit... !!! FIX !!! -// obj_segsize[obj_index][2] = (GetLong(ptr + 12) + secalign) & ~secalign; - if (vflag > 1) printf("AddSymbols: Resetting common label to BSS label\n"); @@ -2007,7 +1846,7 @@ int AddSymbols(struct OFILE * Ofile) sstr + index, Ofile, value, type)) return 1; // Error if addition failed } - // Check for built-in externals... + // Make sure it's not a built-in external... else if ((strcmp(sstr + index, "_TEXT_E") != 0) && (strcmp(sstr + index, "_DATA_E") != 0) && (strcmp(sstr + index, "_BSS_E") != 0)) @@ -2104,7 +1943,7 @@ int DoItem(struct OFILE * obj) } // Check archive name length - if (strlen(obj->o_arname) > FNLEN - 1) + if (strlen(obj->o_arname) > (FNLEN - 1)) { printf("Archive name too long: %s\n", obj->o_arname); return 1; @@ -2121,45 +1960,42 @@ int DoItem(struct OFILE * obj) Ofile->o_flags = obj->o_flags; Ofile->o_image = obj->o_image; Ofile->isArchiveFile = obj->isArchiveFile; + Ofile->segSize[TEXT] = obj->segSize[TEXT]; + Ofile->segSize[DATA] = obj->segSize[DATA]; + Ofile->segSize[BSS] = obj->segSize[BSS]; char * ptr = obj->o_image; - // Don't do anything if this is just an ARCHIVE marker, just add the file - // to the olist - // (Shamus: N.B.: it does no such ARCHIVE thing ATM) - if (!(obj->o_flags & O_ARCHIVE)) - { - Ofile->o_header.magic = GetLong(ptr); - Ofile->o_header.tsize = GetLong(ptr + 4); - Ofile->o_header.dsize = GetLong(ptr + 8); - Ofile->o_header.bsize = GetLong(ptr + 12); - 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 - Ofile->o_header.bsize = (Ofile->o_header.bsize + secalign) & ~secalign; + Ofile->o_header.magic = GetLong(ptr); + Ofile->o_header.tsize = GetLong(ptr + 4); + Ofile->o_header.dsize = GetLong(ptr + 8); + Ofile->o_header.bsize = GetLong(ptr + 12); + 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); - if ((Ofile->o_header.dsize & 7) && wflag) - { - printf("Warning: data segment size of "); - WriteARName(Ofile); - printf(" is not a phrase multiple\n"); - } + // Round BSS off to alignment boundary (??? isn't this already done ???) + Ofile->o_header.bsize = (Ofile->o_header.bsize + secalign) & ~secalign; - // Check for odd segment sizes - if ((Ofile->o_header.tsize & 1) || (Ofile->o_header.dsize & 1) - || (Ofile->o_header.bsize & 1)) - { - printf("Error: odd-sized segment in "); - WriteARName(Ofile); - printf("; link aborted.\n"); - return 1; - } + if ((Ofile->o_header.dsize & 7) && wflag) + { + printf("Warning: data segment size of "); + WriteARName(Ofile); + printf(" is not a phrase multiple\n"); + } - if (AddSymbols(Ofile)) - return 1; + // Check for odd segment sizes + if ((Ofile->o_header.tsize & 1) || (Ofile->o_header.dsize & 1) + || (Ofile->o_header.bsize & 1)) + { + printf("Error: odd-sized segment in "); + WriteARName(Ofile); + printf("; link aborted.\n"); + return 1; } + if (AddSymbols(Ofile)) + return 1; + // Add this file to the olist if (olist == NULL) olist = Ofile; @@ -2346,8 +2182,8 @@ int AddToProcessingList(char * ptr, char * fname, char * arname, uint8_t arFile, // Image size for include files is: // Header ....... 32 bytes // Data ......... dsize -// Sym Fixups ... 2 * 12 bytes -// Symbol Size .. 4 bytes (Value to include symbols and terminating null) +// Sym fixups ... 2 * 12 bytes +// Symbol size .. 4 bytes (Value to include symbols and terminating null) // Symbols ...... (strlen(sym1) + 1) + (strlen(sym2) + 1) // Terminate .... 4 bytes (0x00000000) // @@ -2356,6 +2192,7 @@ int LoadInclude(char * fname, int handle, char * sym1, char * sym2, int segment) char * ptr, * sptr; int i; unsigned symtype = 0; + uint32_t tSize = 0, dSize = 0, bSize = 0; long fsize = FileSize(handle); // Get size of include file long dsize = (fsize + secalign) & ~secalign; // Align size to boundary @@ -2383,8 +2220,6 @@ int LoadInclude(char * fname, int handle, char * sym1, char * sym2, int segment) close(handle); - strcpy(obj_fname[obj_index], PathTail(fname)); - // Build this image's dummy header PutLong(ptr, 0x00000107); // Magic number @@ -2393,22 +2228,16 @@ int LoadInclude(char * fname, int handle, char * sym1, char * sym2, int segment) 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; - obj_segsize[obj_index][2] = 0; + tSize = dsize; } else { 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; - obj_segsize[obj_index][2] = 0; + dSize = dsize; } - obj_index++; // Increment object count - PutLong(ptr+12, 0L); // BSS size PutLong(ptr+16, 24); // Symbol table size PutLong(ptr+20, 0L); // Entry point @@ -2446,7 +2275,7 @@ int LoadInclude(char * fname, int handle, char * sym1, char * sym2, int segment) PutLong(sptr, 0L); // Terminating long for object file - return AddToProcessingList(ptr, fname, nullStr, 0, obj_segsize[obj_index - 1][0], obj_segsize[obj_index - 1][1], obj_segsize[obj_index - 1][2]); + return AddToProcessingList(ptr, fname, nullStr, 0, tSize, dSize, bSize); } @@ -2459,6 +2288,8 @@ int LoadInclude(char * fname, int handle, char * sym1, char * sym2, int segment) // int LoadObject(char * fname, int fd, char * ptr) { + uint32_t tSize = 0, dSize = 0, bSize = 0; + if (ptr == NULL) { long size = FileSize(fd); @@ -2482,19 +2313,14 @@ int LoadObject(char * fname, int fd, char * ptr) return 1; } - // SCPCD: get the name of the file instead of all pathname - strcpy(obj_fname[obj_index], PathTail(fname)); - obj_segsize[obj_index][0] = (GetLong(ptr + 4) + secalign) & ~secalign; - obj_segsize[obj_index][1] = (GetLong(ptr + 8) + secalign) & ~secalign; - obj_segsize[obj_index][2] = (GetLong(ptr + 12) + secalign) & ~secalign; - obj_index++; - - close(fd); // Close file + tSize = (GetLong(ptr + 4) + secalign) & ~secalign; + dSize = (GetLong(ptr + 8) + secalign) & ~secalign; + bSize = (GetLong(ptr + 12) + secalign) & ~secalign; + close(fd); } // Now add this image to the list of pending ofiles (plist) - // This routine is shared by LoadInclude after it builds the image - return AddToProcessingList(ptr, fname, nullStr, 0, obj_segsize[obj_index - 1][0], obj_segsize[obj_index - 1][1], obj_segsize[obj_index - 1][2]); + return AddToProcessingList(ptr, fname, nullStr, 0, tSize, dSize, bSize); } @@ -2608,13 +2434,11 @@ int LoadArchive(char * fname, int fd) objName[lastChar] = 0; //printf("Processing object \"%s\" (size == %i, obj_index == %i)...\n", objName, atoi(objSize), obj_index); - strcpy(obj_fname[obj_index], objName); - obj_segsize[obj_index][0] = (GetLong(ptr + 60 + 4) + secalign) & ~secalign; - obj_segsize[obj_index][1] = (GetLong(ptr + 60 + 8) + secalign) & ~secalign; - obj_segsize[obj_index][2] = (GetLong(ptr + 60 + 12) + secalign) & ~secalign; - obj_index++; + uint32_t tSize = (GetLong(ptr + 60 + 4) + secalign) & ~secalign; + uint32_t dSize = (GetLong(ptr + 60 + 8) + secalign) & ~secalign; + uint32_t bSize = (GetLong(ptr + 60 + 12) + secalign) & ~secalign; - if (AddToProcessingList(ptr + 60, objName, fname, 1, obj_segsize[obj_index - 1][0], obj_segsize[obj_index - 1][1], obj_segsize[obj_index - 1][2])) + if (AddToProcessingList(ptr + 60, objName, fname, 1, tSize, dSize, bSize)) return 1; } @@ -3210,7 +3034,6 @@ void ShowHelp(void) void ExitLinker(void) { char tempbuf[128]; - char * c; // Display link status if verbose mode if (vflag) @@ -3220,7 +3043,7 @@ void ExitLinker(void) if (waitflag) { printf("\nPress the [RETURN] key to continue. "); - c = fgets(tempbuf, 128, stdin); + char * c = fgets(tempbuf, 128, stdin); } exit(errflag); @@ -3229,14 +3052,10 @@ void ExitLinker(void) int main(int argc, char * argv[]) { - char * s = NULL; // String pointer for "getenv" - struct HREC * utemp; // Temporary hash record pointer - struct OHEADER * header; // Pointer to output header structure - cmdlnexec = argv[0]; // Obtain executable name - s = getenv("RLNPATH"); + char * s = getenv("RLNPATH"); // Attempt to obtain env variable - if (s) // Attempt to obtain env variable + if (s) strcpy(libdir, s); // Store it if found // Initialize some vars @@ -3252,7 +3071,7 @@ int main(int argc, char * argv[]) if (!zflag && !vflag) { - ShowVersion(); // Display version information + ShowVersion(); // Display version information versflag = 1; // We've dumped the version banner } @@ -3285,7 +3104,7 @@ int main(int argc, char * argv[]) // Don't list them if two -u's or more if (uflag < 2) { - utemp = unresolved; + struct HREC * utemp = unresolved; while (utemp != NULL) { @@ -3303,8 +3122,8 @@ int main(int argc, char * argv[]) } } - // Make one output file from input objs - header = MakeOutputFile(); + // Make one output object from input objects + struct OHEADER * header = MakeOutputObject(); if (header == NULL) { @@ -3315,27 +3134,20 @@ int main(int argc, char * argv[]) // Partial linking if (pflag) { - printf("TO DO:Partial linking\n"); + printf("TO DO: Partial linking\n"); errflag = 1; } // Relocatable linking else if (!aflag) { - printf("TO DO:Relocatable linking\n"); + printf("TO DO: Relocatable linking\n"); errflag = 1; } // Absolute linking else { if (vflag) - { - printf("Absolute linking "); - - if (cflag) - printf("(COF)\n"); - else - printf("(ABS)\n"); - } + printf("Absolute linking (%s)\n", (cflag ? "COF" : "ABS")); if (vflag > 1) printf("Header magic is 0x%04X\n", (unsigned int)header->magic);