sinclairql: support the upcoming QL binary linking feature of vlink (still in development). it's behind an undocumented -WL switch now. also, reduce the amount of used dataspace by the size of the relocation table in the current linking mode

git-svn-id: trunk@49234 -
This commit is contained in:
Károly Balogh 2021-04-19 19:09:34 +00:00
parent 2a7aa11163
commit f718567c95
3 changed files with 24 additions and 3 deletions

View File

@ -416,6 +416,7 @@ interface
{$if defined(m68k)}
{ Sinclair QL specific }
sinclairql_metadata_format: string[4] = 'QHDR';
sinclairql_vlink_experimental: boolean = false; { temporary }
{$endif defined(m68k)}
{ default name of the C-style "main" procedure of the library/program }

View File

@ -2761,6 +2761,13 @@ begin
IllegalPara(opt);
end;
{$if defined(m68k)}
'L':
begin
if (target_info.system in [system_m68k_sinclairql]) then
sinclairql_vlink_experimental:=true
else
IllegalPara(opt);
end;
'Q':
begin
if (target_info.system in [system_m68k_sinclairql]) then

View File

@ -115,7 +115,7 @@ begin
end
else
begin
ExeCmd[1]:='vlink -b rawseg -q $FLAGS $GCSECTIONS $OPT $STRIP $MAP -o $EXE -T $RES';
ExeCmd[1]:='vlink $QLFLAGS $FLAGS $GCSECTIONS $OPT $STRIP $MAP -o $EXE -T $RES';
end;
end;
end;
@ -245,6 +245,7 @@ var
DynLinkStr : string;
GCSectionsStr : string;
FlagsStr : string;
QLFlagsStr: string;
MapStr : string;
ExeName: string;
fd,fs: file;
@ -258,6 +259,7 @@ var
QLHeader: TQLHeader;
XTccData: TXTccData;
BinSize: longint;
RelocSize: longint;
DataSpace: DWord;
begin
StripStr:='';
@ -276,6 +278,10 @@ begin
begin
if create_smartlink_sections then
GCSectionsStr:='-gc-all';
if sinclairql_vlink_experimental then
QLFlagsStr:='-b sinclairql -q -'+lower(sinclairql_metadata_format)+' -stack='+tostr(StackSize)
else
QLFlagsStr:='-b rawseg -q';
end;
ExeName:=current_module.exefilename;
@ -292,18 +298,20 @@ begin
Replace(cmdstr,'$STRIP',StripStr);
Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
Replace(cmdstr,'$DYNLINK',DynLinkStr);
Replace(cmdstr,'$QLFLAGS',QLFlagsStr);
MakeSinclairQLExe:=DoExec(BinStr,CmdStr,true,false);
{ Kludge:
With the above linker script, vlink will produce two files. The main binary
and the relocation info. Here we copy the two together. (KB) }
if MakeSinclairQLExe then
if MakeSinclairQLExe and not sinclairql_vlink_experimental then
begin
QLHeader:=DefaultQLHeader;
XTccData:=DefaultXTccData;
BinSize:=0;
RelocSize:=0;
bufsize:=16384;
{$push}
{$i-}
@ -321,13 +329,18 @@ begin
assign(fd,ExeName);
rewrite(fd,1);
assign(fs,ExeName+'.'+ProgramHeaderName+'.rel'+ProgramHeaderName);
reset(fs,1);
RelocSize := FileSize(fs);
close(fs);
assign(fs,ExeName+'.'+ProgramHeaderName);
reset(fs,1);
BinSize := FileSize(fs);
{ We assume .bss size is total size indicated by linker minus emmited binary.
DataSpace size is .bss + stack space }
DataSpace := NToBE(DWord(HeaderSize - BinSize + StackSize));
DataSpace := NToBE(DWord(max((HeaderSize - BinSize) - RelocSize + StackSize,0)));
{ Option: prepend QEmuLator and QPC2 v5 compatible header to EXE }
if sinclairql_metadata_format='QHDR' then