Subversion Repositories Kolibri OS

Rev

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

Rev 7597 Rev 7696
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 26... Line 26...
26
    SIZE_OF_IMAGE_SECTION_HEADER* = 40;
26
    SIZE_OF_IMAGE_SECTION_HEADER* = 40;
Line 27... Line 27...
27
 
27
 
Line 28... Line 28...
28
    (* SectionHeader.Characteristics *)
28
    (* SectionHeader.Characteristics *)
29
 
29
 
30
    SHC_text  = 060000020H;
30
    SHC_text  = 060000020H;
Line 31... Line 31...
31
    SHC_data  = 0C0000040H;
31
    SHC_data  = 040000040H;
32
    SHC_bss   = 0C00000C0H;
32
    SHC_bss   = 0C0000080H;
Line 370... Line 370...
370
    WriteWord(file, h.SizeOfOptionalHeader);
370
    WriteWord(file, h.SizeOfOptionalHeader);
371
    WriteWord(file, h.Characteristics)
371
    WriteWord(file, h.Characteristics)
372
END WriteFileHeader;
372
END WriteFileHeader;
Line 373... Line 373...
373
 
373
 
374
 
374
 
375
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; BaseAddress: INTEGER; console, dll, amd64: BOOLEAN);
375
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; console, dll, amd64: BOOLEAN);
Line 376... Line 376...
376
VAR
376
VAR
Line 377... Line 377...
377
    i, n: INTEGER;
377
    i, n: INTEGER;
Line 378... Line 378...
378
 
378
 
Line -... Line 379...
-
 
379
    Size: RECORD
-
 
380
 
379
    Size: RECORD
381
        Code, Data, Bss, Stack, Import, Reloc, Export: INTEGER
Line 380... Line 382...
380
 
382
 
Line 381... Line 383...
381
        Code, Data, Bss, Stack, Import, Reloc, Export: INTEGER
383
    END;
Line 502... Line 504...
502
    Size.Code  := CHL.Length(program.code);
504
    Size.Code  := CHL.Length(program.code);
503
    Size.Data  := CHL.Length(program.data);
505
    Size.Data  := CHL.Length(program.data);
504
    Size.Bss   := program.bss;
506
    Size.Bss   := program.bss;
505
    Size.Stack := program.stack;
507
    Size.Stack := program.stack;
Line -... Line 508...
-
 
508
 
-
 
509
    IF dll THEN
-
 
510
        BaseAddress := 10000000H
-
 
511
    ELSE
-
 
512
        BaseAddress := 400000H
-
 
513
    END;
506
 
514
 
507
    PEHeader.Signature[0] := 50H;
515
    PEHeader.Signature[0] := 50H;
508
    PEHeader.Signature[1] := 45H;
516
    PEHeader.Signature[1] := 45H;
509
    PEHeader.Signature[2] := 0;
517
    PEHeader.Signature[2] := 0;
Line 554... Line 562...
554
    PEHeader.OptionalHeader.LoaderFlags                  :=  0;
562
    PEHeader.OptionalHeader.LoaderFlags                  :=  0;
555
    PEHeader.OptionalHeader.NumberOfRvaAndSizes          :=  IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
563
    PEHeader.OptionalHeader.NumberOfRvaAndSizes          :=  IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
Line 556... Line 564...
556
 
564
 
557
    InitSection(SectionHeaders[0], ".text", SHC_text);
565
    InitSection(SectionHeaders[0], ".text", SHC_text);
558
    SectionHeaders[0].VirtualSize           :=  Size.Code;
566
    SectionHeaders[0].VirtualSize           :=  Size.Code;
559
    SectionHeaders[0].VirtualAddress        :=  1000H;
567
    SectionHeaders[0].VirtualAddress        :=  SectionAlignment;
560
    SectionHeaders[0].SizeOfRawData         :=  align(Size.Code, FileAlignment);
568
    SectionHeaders[0].SizeOfRawData         :=  align(Size.Code, FileAlignment);
Line 561... Line 569...
561
    SectionHeaders[0].PointerToRawData      :=  PEHeader.OptionalHeader.SizeOfHeaders;
569
    SectionHeaders[0].PointerToRawData      :=  PEHeader.OptionalHeader.SizeOfHeaders;
562
 
570