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 |