Handle absolute BSS segment location of 'xt'

When linking an absolute executable, the data
segment and BSS segment can be assigned an
absolute address, or the special value 'x' to
indicate they are contiguous with the prior
segment (text for data, data for BSS). However,
RLN (like MAC) also accepts an optional segment
specifier after the special value 'x' that allows
explicitly specifying which segment the current
one is contiguous with. For data, the only valid
value is 'xt', meaning contiguous with text.
However, when the data segment is specified to
be at an explicit address rather than contiguous
with the text segment, it is valid to specify that
the BSS segment is contiguous with data ('xd') or
with text ('xt'). RLN was accepting these
additional 't' and 'd' values, but ignoring them.

This change causes RLN to correctly place the BSS
segment after the text segment when its location
is specified as 'xt' as long as the data segment
isn't also contiguous with the text segment.
This commit is contained in:
James Jones 2022-04-16 21:11:21 -07:00 committed by Shamus Hammons
parent cc23da7a6e
commit a0516e2c2a
1 changed files with 39 additions and 4 deletions

43
rln.c
View File

@ -1572,11 +1572,19 @@ struct OHEADER * MakeOutputObject()
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
@ -2809,9 +2817,33 @@ int doargs(int argc, char * argv[])
}
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;
@ -3070,7 +3102,10 @@ void ShowHelp(void)
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");