Skip to content

Commit 8a9b675

Browse files
author
dosworld
committed
Fixed PE reloc rec generation, fixed lost BSS, small fixes into MZ
1 parent 8c90b90 commit 8a9b675

7 files changed

Lines changed: 89 additions & 41 deletions

File tree

BIN/BIN2RDF.EXE

-464 Bytes
Binary file not shown.

BIN/RDFDUMP.EXE

-464 Bytes
Binary file not shown.

BIN/RLIB.EXE

-480 Bytes
Binary file not shown.

BIN/RLINK.EXE

-288 Bytes
Binary file not shown.

SRC/RDFFMT.PAS

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,25 @@ BEGIN
211211
END;
212212

213213
FUNCTION get_word(VAR c : STRING; ofs : INTEGER) : WORD;
214+
VAR r : WORD;
214215
BEGIN
215-
get_word := ORD(c[ofs]) OR (ORD(c[ofs + 1]) SHL 8);
216+
r := ORD(c[ofs + 1]);
217+
r := r SHL 8;
218+
r := r OR ORD(c[ofs]);
219+
get_word := r;
216220
END;
217221

218222
FUNCTION get_dword(VAR c : STRING; ofs : INTEGER) : DWORD;
223+
VAR r : DWORD;
219224
BEGIN
220-
get_dword := ORD(c[ofs]) OR (ORD(c[ofs + 1]) SHL 8) OR (ORD(c[ofs + 2]) SHL 16) OR (ORD(c[ofs + 3]) SHL 24);
225+
r := ORD(c[ofs + 3]);
226+
r := r SHL 8;
227+
r := r OR ORD(c[ofs + 2]);
228+
r := r SHL 8;
229+
r := r OR ORD(c[ofs + 1]);
230+
r := r SHL 8;
231+
r := r OR ORD(c[ofs]);
232+
get_dword := r;
221233
END;
222234

223235
PROCEDURE set_word(VAR c : STRING; ofs : INTEGER; w : WORD);

SRC/RLINK.PAS

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ BEGIN
5151
FillChar(r^, SizeOf(TRDFMETA), #0);
5252
r^.filename := src.filename;
5353
r^.hdr_size := hdr_size;
54-
r^.bhdr_ofs := FilePos(hdr);
54+
r^.hdr_ofs := FilePos(hdr);
5555
r^.next := root;
5656
root := r;
5757
BlockCopy(src, hdr, hdr_size);
@@ -256,8 +256,8 @@ BEGIN
256256
{ build export tables and lookup entry point }
257257
r := build_plan.rdfs;
258258
WHILE r <> NIL DO BEGIN
259-
Seek(build_plan.hdr, r^.bhdr_ofs);
260-
WHILE RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_GLOBAL, s) DO BEGIN
259+
Seek(build_plan.hdr, r^.hdr_ofs);
260+
WHILE RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_GLOBAL, s) DO BEGIN
261261
GET_EXPORT_REC(s, grec);
262262
IF r^.linker.export = NIL THEN BEGIN
263263
GetMem(export, SizeOf(TEXPORTS));
@@ -283,15 +283,15 @@ BEGIN
283283
{ build import tables }
284284
r := build_plan.rdfs;
285285
WHILE (NOT err) AND (r <> NIL) DO BEGIN
286-
Seek(build_plan.hdr, r^.bhdr_ofs);
287-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
286+
Seek(build_plan.hdr, r^.hdr_ofs);
287+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
288288
GET_RELOC_REC(s, rrec);
289289
IF rrec.rseg <= r^.bss_segnum THEN CONTINUE;
290290
IF FindImportInBuildPlan(r^.linker.import, '', rrec.rseg) THEN CONTINUE;
291291
p := FilePos(build_plan.hdr);
292292
find := FALSE;
293-
Seek(build_plan.hdr, r^.bhdr_ofs);
294-
WHILE RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_IMPORT, s) DO BEGIN
293+
Seek(build_plan.hdr, r^.hdr_ofs);
294+
WHILE RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_IMPORT, s) DO BEGIN
295295
GET_IMPORT_REC(s, irec);
296296
IF irec.seg = rrec.rseg THEN BEGIN
297297
find := TRUE;
@@ -373,7 +373,7 @@ BEGIN
373373
WHILE (r <> NIL) AND (NOT err) DO BEGIN
374374
Assign(i, r^.filename);
375375
Reset(i);
376-
err := NOT IsOpen(i) ;
376+
err := NOT IsOpen(i);
377377
IF err THEN BREAK;
378378

379379
r^.linker.smz_bss_ofs := bss_size;
@@ -392,8 +392,8 @@ BEGIN
392392
FilePosAlign(data, 4);
393393

394394
Close(i);
395-
Seek(build_plan.hdr, r^.bhdr_ofs);
396-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_BSS, s) DO BEGIN
395+
Seek(build_plan.hdr, r^.hdr_ofs);
396+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_BSS, s) DO BEGIN
397397
GET_BSS(s, cbss_size);
398398
END;
399399
cbss_size := AlignValue(cbss_size, 4);
@@ -430,8 +430,8 @@ BEGIN
430430
{ resolve relo }
431431
r := build_plan.rdfs;
432432
WHILE (r <> NIL) AND (NOT err) DO BEGIN
433-
Seek(build_plan.hdr, r^.bhdr_ofs);
434-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
433+
Seek(build_plan.hdr, r^.hdr_ofs);
434+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
435435
GET_RELOC_REC(s, rrec);
436436
selfr := (rrec.seg AND $40) <> 0;
437437
fix := 0;
@@ -452,7 +452,7 @@ BEGIN
452452
END ELSE IF rrec.rseg = r^.bss_segnum THEN BEGIN
453453
END ELSE BEGIN
454454
import := LookupImportByRSeg(r, rrec.rseg);
455-
Inc(fix, import^.export^.rec.offset);
455+
fix := import^.export^.rec.offset;
456456
IF import^.export^.rec.seg
457457
= code_segnum THEN BEGIN
458458
rrec.rseg := code_segnum;
@@ -560,9 +560,9 @@ BEGIN
560560
hdr.min_extra_paragraphs := hdr.ss;
561561
r := build_plan.rdfs;
562562
WHILE (r <> NIL) AND (NOT err) DO BEGIN
563-
Seek(build_plan.hdr, r^.bhdr_ofs);
563+
Seek(build_plan.hdr, r^.hdr_ofs);
564564
bss_size := 0;
565-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_BSS, s) DO BEGIN
565+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_BSS, s) DO BEGIN
566566
GET_BSS(s, bss_size);
567567
END;
568568
bss_size := AlignValue(bss_size, $10);
@@ -574,8 +574,8 @@ BEGIN
574574
{ resolve segrelo }
575575
r := build_plan.rdfs;
576576
WHILE (r <> NIL) AND (NOT err) DO BEGIN
577-
Seek(build_plan.hdr, r^.bhdr_ofs);
578-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_SEGRELO, s) DO BEGIN
577+
Seek(build_plan.hdr, r^.hdr_ofs);
578+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_SEGRELO, s) DO BEGIN
579579
GET_RELOC_REC(s, rrec);
580580
IF rrec.rseg = r^.code_segnum THEN BEGIN
581581
fix := r^.linker.hmz_code_seg;
@@ -617,8 +617,8 @@ BEGIN
617617
{ resolve relo }
618618
r := build_plan.rdfs;
619619
WHILE (r <> NIL) AND (NOT err) DO BEGIN
620-
Seek(build_plan.hdr, r^.bhdr_ofs);
621-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
620+
Seek(build_plan.hdr, r^.hdr_ofs);
621+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
622622
GET_RELOC_REC(s, rrec);
623623
selfr := (rrec.seg AND $40) <> 0;
624624
fix := 0;
@@ -749,8 +749,8 @@ BEGIN
749749
r := build_plan.rdfs;
750750
WHILE (r <> NIL) AND (NOT err) DO BEGIN
751751
r^.linker.smz_bss_ofs := bss_size;
752-
Seek(build_plan.hdr, r^.bhdr_ofs);
753-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_BSS, s) DO BEGIN
752+
Seek(build_plan.hdr, r^.hdr_ofs);
753+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_BSS, s) DO BEGIN
754754
GET_BSS(s, bss_size);
755755
END;
756756
bss_size := AlignValue(bss_size, 2);
@@ -762,8 +762,8 @@ BEGIN
762762
{ resolve segrelo }
763763
r := build_plan.rdfs;
764764
WHILE (r <> NIL) AND (NOT err) DO BEGIN
765-
Seek(build_plan.hdr, r^.bhdr_ofs);
766-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_SEGRELO, s) DO BEGIN
765+
Seek(build_plan.hdr, r^.hdr_ofs);
766+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_SEGRELO, s) DO BEGIN
767767
GET_RELOC_REC(s, rrec);
768768
IF rrec.rseg = r^.code_segnum THEN BEGIN
769769
fix := smz_code_seg;
@@ -808,8 +808,8 @@ BEGIN
808808
{ resolve relo }
809809
r := build_plan.rdfs;
810810
WHILE (r <> NIL) AND (NOT err) DO BEGIN
811-
Seek(build_plan.hdr, r^.bhdr_ofs);
812-
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.bhdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
811+
Seek(build_plan.hdr, r^.hdr_ofs);
812+
WHILE (NOT err) AND RDF_NLOOKUPREC(build_plan.hdr, r^.hdr_ofs + r^.hdr_size, RREC_RELOC, s) DO BEGIN
813813
GET_RELOC_REC(s, rrec);
814814
selfr := (rrec.seg AND $40) <> 0;
815815
fix := 0;

SRC/RLINKOUT.PAS

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1+
{ MIT License
2+
3+
Copyright (c) 2022 Viacheslav Komenda
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.
22+
23+
https://github.com/DosWorld/rtools }
124
{$A+,I+,S-,R-,D-,L-,Q-,F-,G-}
225
UNIT rlinkout;
326

@@ -71,10 +94,10 @@ TRDFMETA = RECORD
7194
bss_segnum : WORD;
7295
code_segnum : WORD;
7396

74-
hdr_size : DWORD;
75-
bhdr_ofs : DWORD;
76-
linker : TLINKDATA;
77-
next : PRDFMETA;
97+
hdr_size : DWORD;
98+
hdr_ofs : DWORD;
99+
linker : TLINKDATA;
100+
next : PRDFMETA;
78101
END;
79102

80103
IMAGE_BUILD_PLAN = RECORD
@@ -265,7 +288,13 @@ $F6, $4F, $80, $7D, $FF, $5C, $74, $C6, $C6, $05, $5C, $47, $EB, $C0, $93, $C3,
265288
$50, $41, $54, $48, $3D, $0D, $0A, $63, $61, $6E, $6E, $6F, $74, $20, $66, $69,
266289
$6E, $64, $20, $6C, $6F, $61, $64, $65, $72, $20, $44, $50, $4D, $49, $4C, $44,
267290
$33, $32, $2E, $45, $58, $45, $24, $00, $00, $00, $00, $00, $00, $00, $00, $00);
268-
291+
{
292+
MZEXE_STUB : array[0..63] of byte = (
293+
$4D, $5A, $3C, $00, $01, $00, $00, $00, $02, $00, $94, $00, $94, $00, $F0, $FF,
294+
$40, $09, $00, $00, $00, $01, $F0, $FF, $40, $00, $00, $00, $00, $00, $00, $00,
295+
$FC, $31, $C0, $50, $BA, $0C, $01, $B4, $09, $CD, $21, $C3, $54, $68, $69, $73,
296+
$20, $69, $73, $20, $57, $69, $6E, $50, $45, $2E, $24, $00, $40, $00, $00, $00);
297+
}
269298
FUNCTION AlignValue(value : DWORD; align : DWORD) : DWORD;
270299
VAR n : DWORD;
271300
BEGIN
@@ -757,12 +786,12 @@ BEGIN
757786
WHILE t^.items <> NIL DO BEGIN
758787
item := t^.items;
759788
t^.items := t^.items^.next;
760-
BlockWrite(o, item^.reloc, item^.reloc_count SHL 2);
789+
BlockWrite(o, item^.reloc, item^.reloc_count SHL 1);
761790
Inc(i, item^.reloc_count);
762791
FreeMem(item, SizeOf(PE_RELOC_ITEM));
763792
END;
764-
IF (i AND 1) <> 0 THEN WriteWord(o, 0);
765-
SetDWord(o, p, i);
793+
IF (i AND 1) <> 0 THEN BEGIN Inc(i); WriteWord(o, 0); END;
794+
SetDWord(o, p, 8 + (i shl 1));
766795
Seek(o, FileSize(o));
767796
FreeMem(t, SizeOf(PE_RELOC_TABLE));
768797
END;
@@ -846,7 +875,6 @@ BEGIN
846875
GET_BSS(s, bss_size);
847876
END;
848877
END;
849-
850878
image_base := $400000;
851879

852880
code_ofs := $1000;
@@ -903,24 +931,32 @@ BEGIN
903931
sectCode.vaddr := code_ofs;
904932
sectCode.vsize := AlignValue(code_size, SECT_ALIGN);
905933
sectCode.rawSize := code_size;
906-
{ sectCode.chars := IMAGE_SCN_CNT_CODE OR IMAGE_SCN_MEM_EXECUTE OR IMAGE_SCN_MEM_READ OR IMAGE_SCN_MEM_WRITE;}
907-
sectCode.chars := $60000060;
934+
sectCode.chars := IMAGE_SCN_MEM_EXECUTE
935+
OR IMAGE_SCN_MEM_WRITE
936+
OR IMAGE_SCN_MEM_READ
937+
OR IMAGE_SCN_CNT_CODE
938+
OR IMAGE_SCN_CNT_INITIALIZED_DATA;
908939
BlockWrite(o, sectCode, SizeOf(sectCode));
909940

910941
FillChar(sectData, SizeOf(sectData), #0);
911942
SetPeSectName(sectData, 'DATA');
912943
sectData.vaddr := data_ofs;
913944
sectData.vsize := AlignValue(data_size, SECT_ALIGN);
914945
sectData.rawSize := data_size;
915-
{ sectData.chars := IMAGE_SCN_CNT_CODE OR IMAGE_SCN_MEM_EXECUTE OR IMAGE_SCN_MEM_READ OR IMAGE_SCN_MEM_WRITE;}
916-
sectData.chars := $C0000040;
946+
sectData.chars := IMAGE_SCN_MEM_READ
947+
OR IMAGE_SCN_MEM_WRITE
948+
OR IMAGE_SCN_MEM_EXECUTE
949+
OR IMAGE_SCN_CNT_INITIALIZED_DATA;
917950
BlockWrite(o, sectData, SizeOf(sectData));
918951

919952
FillChar(sectBss, SizeOf(sectBss), #0);
920953
SetPeSectName(sectBss, 'BSS');
921954
sectBss.vaddr := bss_ofs;
922955
sectBss.vsize := bss_size;
923-
sectBss.chars := IMAGE_SCN_CNT_UNINITIALIZED_DATA OR IMAGE_SCN_MEM_READ OR IMAGE_SCN_MEM_WRITE;
956+
sectBss.chars := IMAGE_SCN_CNT_UNINITIALIZED_DATA
957+
OR IMAGE_SCN_MEM_READ
958+
OR IMAGE_SCN_MEM_EXECUTE
959+
OR IMAGE_SCN_MEM_WRITE;
924960
BlockWrite(o, sectBss, SizeOf(sectBss));
925961

926962
FillChar(sectRelo, SizeOf(sectRelo), #0);

0 commit comments

Comments
 (0)