//
-// RLN - Reboot's Linker for the Atari Jaguar console system
-// Copyright (C) 199x, Allan K. Pratt, 2014-2018 Reboot & Friends
+// RLN - Renamed Linker for the Atari Jaguar console system
+// Copyright (C) 199x, Allan K. Pratt, 2014-2021 Reboot & Friends
//
#include "rln.h"
dbase = dval;
if (!bval)
- // BSS follows DATA
- bbase = dval + datasize;
+ {
+ if (btype == -2)
+ // BSS follows TEXT
+ bbase = tval + textsize;
+ else
+ // BSS follows DATA
+ bbase = dval + datasize;
+ }
else
+ {
// BSS is independent of DATA
bbase = bval;
+ }
}
// Inject segment end labels, for C compilers that expect this shite
}
else if ((*argv[i] == 'x' || *argv[i] == 'X'))
{
- btype = -3; // BSS follows DATA
+ switch (argv[i][1])
+ {
+ case 'd': case 'D': case '\0':
+ btype = -3; // BSS follows DATA
+ break;
+
+ case 't': case 'T':
+ btype = -2; // BSS follows TEXT
+ if (btype == dtype)
+ {
+ printf("Error in bss-segment address: data-segment also follows text\n");
+ return 1;
+ }
+ break;
+
+ default:
+ btype = -4; // Error
+ break;
+ }
}
else if (GetHexValue(argv[i], &bval))
+ {
+ btype = -4;
+ return 1;
+ }
+
+ if (btype == -4)
{
printf("Error in bss-segment address: %s is not 'r', 'x[td]', or an address.", argv[i]);
return 1;
case 'e':
case 'E': // Output COFF (absolute only)
cflag = 1;
+
+ if (noheaderflag)
+ printf("Warning: -e overridden by -n, output will be headerless\n");
+
break;
case 'g':
case 'G': // Output source level debugging
if (noheaderflag)
warn('n', 1);
+ if (cflag)
+ printf("Warning: -e overridden by -n, output will be headerless\n");
+
noheaderflag = 1;
break;
case 'o':
"| '__| | '_ \\\n"
"| | | | | | |\n"
"|_| |_|_| |_|\n"
- "\nReboot's Linker for Atari Jaguar\n"
- "Copyright (c) 199x Allan K. Pratt, 2014-2018 Reboot\n"
+ "\nRenamed Linker for Atari Jaguar\n"
+ "Copyright (c) 199x Allan K. Pratt, 2014-2021 Reboot & Friends\n"
"V%i.%i.%i %s (%s)\n\n", MAJOR, MINOR, PATCH, __DATE__, PLATFORM);
}
}
printf("\n");
printf("Options:\n");
printf(" -? or -h display usage information\n");
- printf(" -a <text> <data> <bss> output absolute file\n");
+ printf(" -a <text> <data> <bss> output absolute file (default: ABS)\n");
printf(" hex value: segment address\n");
printf(" r: relocatable segment\n");
- printf(" x: contiguous segment\n");
+ printf(" x[dt]: contiguous segment\n");
+ printf(" for contiguous bss:\n");
+ printf(" d(default): follows data segment\n");
+ printf(" t: follows text segment\n");
printf(" -b don't remove multiply defined local labels\n");
printf(" -c <fname> add contents of <fname> to command line\n");
printf(" -d wait for key after link\n");
printf(" -ii <fname> <label> incbin <fname> and set <label> (no truncation)\n");
printf(" -l add local symbols\n");
printf(" -m produce load symbols map\n");
- printf(" -n output no file header to absolute file\n");
+ printf(" -n output no file header to absolute file (overrides -e)\n");
printf(" -o <fname> set output name\n");
printf(" -r<size> section alignment size\n");
printf(" w: word (2 bytes)\n");
printf(" -u allow unresolved symbols (experimental)\n");
printf(" -v set verbose mode\n");
printf(" -w show linker warnings\n");
+ printf(" -y <fname> set include path (also set by RLNPATH)\n");
printf(" -z suppress banner\n");
printf("\n");
}