Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7696 Rev 7983
Line 1... Line 1...
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
Line 3... Line 3...
3
 
3
 
4
    Copyright (c) 2018-2019, Anton Krotov
4
    Copyright (c) 2018-2019, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE PE32;
8
MODULE PE32;
Line 9... Line 9...
9
 
9
 
Line 163... Line 163...
163
    PEHeader:        IMAGE_NT_HEADERS;
163
    PEHeader:        IMAGE_NT_HEADERS;
164
    SectionHeaders:  ARRAY 16 OF IMAGE_SECTION_HEADER;
164
    SectionHeaders:  ARRAY 16 OF IMAGE_SECTION_HEADER;
165
    Relocations:     LISTS.LIST;
165
    Relocations:     LISTS.LIST;
166
    bit64:           BOOLEAN;
166
    bit64:           BOOLEAN;
167
    libcnt:          INTEGER;
167
    libcnt:          INTEGER;
168
 
-
 
169
 
-
 
170
PROCEDURE SIZE (): INTEGER;
168
    SizeOfWord:      INTEGER;
171
    RETURN SIZE_OF_DWORD * (ORD(bit64) + 1)
-
 
172
END SIZE;
-
 
Line 173... Line 169...
173
 
169
 
174
 
170
 
Line 256... Line 252...
256
            INC(CurrentThunk)
252
            INC(CurrentThunk)
257
        END;
253
        END;
258
        import := import.next(BIN.IMPRT)
254
        import := import.next(BIN.IMPRT)
259
    END
255
    END
Line 260... Line 256...
260
 
256
 
261
    RETURN (libcnt + 1) * 5 * SIZE_OF_DWORD + (proccnt + libcnt) * 2 * SIZE()
257
    RETURN (libcnt + 1) * 5 * SIZE_OF_DWORD + (proccnt + libcnt) * 2 * SizeOfWord
Line 262... Line 258...
262
END GetImportSize;
258
END GetImportSize;
263
 
259
 
264
 
260
 
265
PROCEDURE fixup (program: BIN.PROGRAM; Address: VIRTUAL_ADDR);
261
PROCEDURE fixup (program: BIN.PROGRAM; Address: VIRTUAL_ADDR);
266
VAR
262
VAR
267
    reloc:   BIN.RELOC;
263
    reloc: BIN.RELOC;
268
    iproc:   BIN.IMPRT;
-
 
Line 269... Line 264...
269
    L:       INTEGER;
264
    iproc: BIN.IMPRT;
270
    delta:   INTEGER;
265
    code:  CHL.BYTELIST;
271
    AdrImp:  INTEGER;
-
 
-
 
266
    L, delta, delta0, AdrImp: INTEGER;
272
 
267
 
-
 
268
BEGIN
-
 
269
    AdrImp := Address.Import + (libcnt + 1) * 5 * SIZE_OF_DWORD;
273
BEGIN
270
    code := program.code;
Line 274... Line 271...
274
    AdrImp := Address.Import + (libcnt + 1) * 5 * SIZE_OF_DWORD;
271
    reloc := program.rel_list.first(BIN.RELOC);
275
 
272
    delta0 := 3 - 7 * ORD(bit64);
Line 276... Line 273...
276
    reloc := program.rel_list.first(BIN.RELOC);
273
 
Line 277... Line 274...
277
    WHILE reloc # NIL DO
274
    WHILE reloc # NIL DO
278
 
275
 
Line 279... Line 276...
279
        L := BIN.get32le(program.code, reloc.offset);
276
        L := BIN.get32le(code, reloc.offset);
280
        delta := 3 - reloc.offset - Address.Code - 7 * ORD(bit64);
277
        delta := delta0 - reloc.offset - Address.Code;
Line 281... Line 278...
281
 
278
 
282
        CASE reloc.opcode OF
279
        CASE reloc.opcode OF
Line 283... Line 280...
283
 
280
 
284
        |BIN.PICDATA:
281
        |BIN.PICDATA:
285
              BIN.put32le(program.code, reloc.offset, L + Address.Data + delta)
282
              BIN.put32le(code, reloc.offset, L + Address.Data + delta)
Line 286... Line 283...
286
 
283
 
Line 287... Line 284...
287
        |BIN.PICCODE:
284
        |BIN.PICCODE:
288
              BIN.put32le(program.code, reloc.offset, BIN.GetLabel(program, L) + Address.Code + delta)
285
              BIN.put32le(code, reloc.offset, BIN.GetLabel(program, L) + Address.Code + delta)
Line 416... Line 413...
416
    PROCEDURE WriteOptHeader (file: FILE; h: IMAGE_OPTIONAL_HEADER);
413
    PROCEDURE WriteOptHeader (file: FILE; h: IMAGE_OPTIONAL_HEADER);
417
    VAR
414
    VAR
418
        i: INTEGER;
415
        i: INTEGER;
Line 419... Line 416...
419
 
416
 
420
    BEGIN
-
 
421
 
417
    BEGIN
Line 422... Line 418...
422
        WriteWord(file, h.Magic);
418
        WriteWord(file, h.Magic);
423
 
419
 
Line 497... Line 493...
497
    END InitSection;
493
    END InitSection;
Line 498... Line 494...
498
 
494
 
499
 
495
 
-
 
496
BEGIN
500
BEGIN
497
    bit64 := amd64;
Line 501... Line 498...
501
    bit64 := amd64;
498
    SizeOfWord := SIZE_OF_DWORD * (ORD(bit64) + 1);
502
    Relocations := LISTS.create(NIL);
499
    Relocations := LISTS.create(NIL);
503
 
500
 
Line 530... Line 527...
530
    PEHeader.FileHeader.NumberOfSymbols       :=  0H;
527
    PEHeader.FileHeader.NumberOfSymbols       :=  0H;
531
    PEHeader.FileHeader.SizeOfOptionalHeader  :=  WCHR(0E0H + 10H * ORD(amd64));
528
    PEHeader.FileHeader.SizeOfOptionalHeader  :=  WCHR(0E0H + 10H * ORD(amd64));
532
    PEHeader.FileHeader.Characteristics       :=  WCHR(010EH + (20H - 100H) * ORD(amd64) + 2000H * ORD(dll));
529
    PEHeader.FileHeader.Characteristics       :=  WCHR(010EH + (20H - 100H) * ORD(amd64) + 2000H * ORD(dll));
Line 533... Line 530...
533
 
530
 
534
    PEHeader.OptionalHeader.Magic                        :=  WCHR(010BH + 100H * ORD(amd64));
531
    PEHeader.OptionalHeader.Magic                        :=  WCHR(010BH + 100H * ORD(amd64));
535
    PEHeader.OptionalHeader.MajorLinkerVersion           :=  mConst.vMajor;
532
    PEHeader.OptionalHeader.MajorLinkerVersion           :=  UTILS.vMajor;
536
    PEHeader.OptionalHeader.MinorLinkerVersion           :=  mConst.vMinor;
533
    PEHeader.OptionalHeader.MinorLinkerVersion           :=  UTILS.vMinor;
537
    PEHeader.OptionalHeader.SizeOfCode                   :=  align(Size.Code, FileAlignment);
534
    PEHeader.OptionalHeader.SizeOfCode                   :=  align(Size.Code, FileAlignment);
538
    PEHeader.OptionalHeader.SizeOfInitializedData        :=  0;
535
    PEHeader.OptionalHeader.SizeOfInitializedData        :=  0;
539
    PEHeader.OptionalHeader.SizeOfUninitializedData      :=  0;
536
    PEHeader.OptionalHeader.SizeOfUninitializedData      :=  0;
540
    PEHeader.OptionalHeader.AddressOfEntryPoint          :=  SectionAlignment;
537
    PEHeader.OptionalHeader.AddressOfEntryPoint          :=  SectionAlignment;
Line 656... Line 653...
656
    WR.Padding(File, FileAlignment);
653
    WR.Padding(File, FileAlignment);
Line 657... Line 654...
657
 
654
 
658
    n := (libcnt + 1) * 5;
655
    n := (libcnt + 1) * 5;
Line 659... Line 656...
659
    ImportTable := CHL.CreateIntList();
656
    ImportTable := CHL.CreateIntList();
660
 
657
 
661
    FOR i := 0 TO (Size.Import - n * SIZE_OF_DWORD) DIV SIZE() + n - 1 DO
658
    FOR i := 0 TO (Size.Import - n * SIZE_OF_DWORD) DIV SizeOfWord + n - 1 DO
Line 662... Line 659...
662
        CHL.PushInt(ImportTable, 0)
659
        CHL.PushInt(ImportTable, 0)
663
    END;
660
    END;
664
 
661
 
665
    i := 0;
662
    i := 0;
666
    import := program.imp_list.first(BIN.IMPRT);
663
    import := program.imp_list.first(BIN.IMPRT);
667
    WHILE import # NIL DO
664
    WHILE import # NIL DO
668
        IF import.label = 0 THEN
665
        IF import.label = 0 THEN
669
            CHL.SetInt(ImportTable, i + 0, import.OriginalFirstThunk * SIZE() + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD);
666
            CHL.SetInt(ImportTable, i + 0, import.OriginalFirstThunk * SizeOfWord + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD);
670
            CHL.SetInt(ImportTable, i + 1, 0);
667
            CHL.SetInt(ImportTable, i + 1, 0);
671
            CHL.SetInt(ImportTable, i + 2, 0);
668
            CHL.SetInt(ImportTable, i + 2, 0);
672
            CHL.SetInt(ImportTable, i + 3, import.nameoffs + Size.Import + SectionHeaders[3].VirtualAddress);
669
            CHL.SetInt(ImportTable, i + 3, import.nameoffs + Size.Import + SectionHeaders[3].VirtualAddress);
673
            CHL.SetInt(ImportTable, i + 4, import.FirstThunk * SIZE() + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD);
670
            CHL.SetInt(ImportTable, i + 4, import.FirstThunk * SizeOfWord + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD);
674
            i := i + 5
671
            i := i + 5