Rev 7983 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7983 | Rev 8097 | ||
---|---|---|---|
Line 26... | Line 26... | ||
26 | FH = PE32.IMAGE_FILE_HEADER; |
26 | FH = PE32.IMAGE_FILE_HEADER; |
Line 27... | Line 27... | ||
27 | 27 | ||
Line 28... | Line 28... | ||
28 | SH = PE32.IMAGE_SECTION_HEADER; |
28 | SH = PE32.IMAGE_SECTION_HEADER; |
29 | 29 | ||
30 | 30 | ||
31 | PROCEDURE WriteReloc (File: WR.FILE; VirtualAddress, SymbolTableIndex, Type: INTEGER); |
31 | PROCEDURE WriteReloc (VirtualAddress, SymbolTableIndex, Type: INTEGER); |
32 | BEGIN |
32 | BEGIN |
33 | WR.Write32LE(File, VirtualAddress); |
33 | WR.Write32LE(VirtualAddress); |
Line 34... | Line 34... | ||
34 | WR.Write32LE(File, SymbolTableIndex); |
34 | WR.Write32LE(SymbolTableIndex); |
35 | WR.Write16LE(File, Type) |
35 | WR.Write16LE(Type) |
36 | END WriteReloc; |
36 | END WriteReloc; |
- | 37 | ||
Line 37... | Line 38... | ||
37 | 38 | ||
38 | 39 | PROCEDURE Reloc (program: BIN.PROGRAM); |
|
39 | PROCEDURE Reloc (program: BIN.PROGRAM; File: WR.FILE); |
40 | VAR |
Line -... | Line 41... | ||
- | 41 | reloc: BIN.RELOC; |
|
40 | VAR |
42 | offset: INTEGER; |
41 | reloc: BIN.RELOC; |
43 | |
42 | 44 | BEGIN |
|
43 | BEGIN |
45 | reloc := program.rel_list.first(BIN.RELOC); |
44 | reloc := program.rel_list.first(BIN.RELOC); |
46 | WHILE reloc # NIL DO |
45 | WHILE reloc # NIL DO |
47 | |
46 | 48 | offset := reloc.offset; |
|
Line 47... | Line 49... | ||
47 | CASE reloc.opcode OF |
49 | CASE reloc.opcode OF |
48 | |BIN.RIMP, |
50 | |BIN.RIMP, |
49 | BIN.IMPTAB: WriteReloc(File, reloc.offset, 4, 6) |
51 | BIN.IMPTAB: WriteReloc(offset, 4, 6) |
Line 60... | Line 62... | ||
60 | PROCEDURE RelocCount (program: BIN.PROGRAM): INTEGER; |
62 | PROCEDURE RelocCount (program: BIN.PROGRAM): INTEGER; |
61 | VAR |
63 | VAR |
62 | reloc: BIN.RELOC; |
64 | reloc: BIN.RELOC; |
63 | iproc: BIN.IMPRT; |
65 | iproc: BIN.IMPRT; |
64 | res, L: INTEGER; |
66 | res, L: INTEGER; |
- | 67 | offset: INTEGER; |
|
65 | code: CHL.BYTELIST; |
68 | code: CHL.BYTELIST; |
Line 66... | Line 69... | ||
66 | 69 | ||
67 | BEGIN |
70 | BEGIN |
68 | res := 0; |
71 | res := 0; |
69 | code := program.code; |
72 | code := program.code; |
70 | reloc := program.rel_list.first(BIN.RELOC); |
73 | reloc := program.rel_list.first(BIN.RELOC); |
Line 71... | Line 74... | ||
71 | WHILE reloc # NIL DO |
74 | WHILE reloc # NIL DO |
- | 75 | ||
Line 72... | Line 76... | ||
72 | 76 | INC(res); |
|
73 | INC(res); |
77 | offset := reloc.offset; |
74 | 78 | ||
75 | IF reloc.opcode = BIN.RIMP THEN |
79 | IF reloc.opcode = BIN.RIMP THEN |
76 | L := BIN.get32le(code, reloc.offset); |
80 | L := BIN.get32le(code, offset); |
Line 77... | Line 81... | ||
77 | iproc := BIN.GetIProc(program, L); |
81 | iproc := BIN.GetIProc(program, L); |
78 | BIN.put32le(code, reloc.offset, iproc.label) |
82 | BIN.put32le(code, offset, iproc.label) |
79 | END; |
83 | END; |
80 | 84 | ||
Line 81... | Line 85... | ||
81 | IF reloc.opcode = BIN.RCODE THEN |
85 | IF reloc.opcode = BIN.RCODE THEN |
82 | L := BIN.get32le(code, reloc.offset); |
86 | L := BIN.get32le(code, offset); |
Line 90... | Line 94... | ||
90 | END RelocCount; |
94 | END RelocCount; |
Line 91... | Line 95... | ||
91 | 95 | ||
92 | 96 | ||
93 | PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; ver: INTEGER); |
- | |
94 | VAR |
97 | PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; ver: INTEGER); |
95 | File: WR.FILE; |
98 | VAR |
Line 96... | Line 99... | ||
96 | exp: BIN.EXPRT; |
99 | exp: BIN.EXPRT; |
Line 143... | Line 146... | ||
143 | ASSERT(LENGTH(szversion) = 7); |
146 | ASSERT(LENGTH(szversion) = 7); |
Line 144... | Line 147... | ||
144 | 147 | ||
145 | KOS.Import(program, 0, ImportTable, ILen, LibCount, isize); |
148 | KOS.Import(program, 0, ImportTable, ILen, LibCount, isize); |
Line 146... | Line 149... | ||
146 | ExpCount := LISTS.count(program.exp_list); |
149 | ExpCount := LISTS.count(program.exp_list); |
147 | 150 | ||
148 | icount := CHL.Length(program.import); |
151 | icount := CHL.Length(program._import); |
149 | dcount := CHL.Length(program.data); |
152 | dcount := CHL.Length(program.data); |
Line 150... | Line 153... | ||
150 | ccount := CHL.Length(program.code); |
153 | ccount := CHL.Length(program.code); |
Line 217... | Line 220... | ||
217 | edata.PointerToRelocations := flat.PointerToRelocations + ORD(flat.NumberOfRelocations) * 10; |
220 | edata.PointerToRelocations := flat.PointerToRelocations + ORD(flat.NumberOfRelocations) * 10; |
218 | idata.PointerToRelocations := edata.PointerToRelocations + ORD(edata.NumberOfRelocations) * 10; |
221 | idata.PointerToRelocations := edata.PointerToRelocations + ORD(edata.NumberOfRelocations) * 10; |
Line 219... | Line 222... | ||
219 | 222 | ||
Line 220... | Line 223... | ||
220 | FileHeader.PointerToSymbolTable := idata.PointerToRelocations + ORD(idata.NumberOfRelocations) * 10; |
223 | FileHeader.PointerToSymbolTable := idata.PointerToRelocations + ORD(idata.NumberOfRelocations) * 10; |
Line 221... | Line 224... | ||
221 | 224 | ||
Line 222... | Line 225... | ||
222 | File := WR.Create(FileName); |
225 | WR.Create(FileName); |
223 | 226 | ||
224 | PE32.WriteFileHeader(File, FileHeader); |
227 | PE32.WriteFileHeader(FileHeader); |
225 | 228 | ||
226 | PE32.WriteSectionHeader(File, flat); |
229 | PE32.WriteSectionHeader(flat); |
Line 227... | Line 230... | ||
227 | PE32.WriteSectionHeader(File, data); |
230 | PE32.WriteSectionHeader(data); |
228 | PE32.WriteSectionHeader(File, edata); |
231 | PE32.WriteSectionHeader(edata); |
Line 229... | Line 232... | ||
229 | PE32.WriteSectionHeader(File, idata); |
232 | PE32.WriteSectionHeader(idata); |
230 | PE32.WriteSectionHeader(File, bss); |
233 | PE32.WriteSectionHeader(bss); |
231 | 234 | ||
232 | CHL.WriteToFile(File, program.code); |
235 | CHL.WriteToFile(program.code); |
233 | CHL.WriteToFile(File, program.data); |
236 | CHL.WriteToFile(program.data); |
234 | 237 | ||
Line 235... | Line 238... | ||
235 | exp := program.exp_list.first(BIN.EXPRT); |
238 | exp := program.exp_list.first(BIN.EXPRT); |
236 | WHILE exp # NIL DO |
239 | WHILE exp # NIL DO |
Line 237... | Line 240... | ||
237 | WR.Write32LE(File, exp.nameoffs + edata.SizeOfRawData - ecount); |
240 | WR.Write32LE(exp.nameoffs + edata.SizeOfRawData - ecount); |
Line 238... | Line 241... | ||
238 | WR.Write32LE(File, exp.label); |
241 | WR.Write32LE(exp.label); |
239 | exp := exp.next(BIN.EXPRT) |
242 | exp := exp.next(BIN.EXPRT) |
Line 240... | Line 243... | ||
240 | END; |
243 | END; |
241 | 244 | ||
242 | WR.Write32LE(File, ((ExpCount + 1) * 2 + 1) * SIZE_OF_DWORD); |
245 | WR.Write32LE(((ExpCount + 1) * 2 + 1) * SIZE_OF_DWORD); |
Line 243... | Line 246... | ||
243 | WR.Write32LE(File, ver); |
246 | WR.Write32LE(ver); |
Line 244... | Line 247... | ||
244 | 247 | ||
Line 245... | Line 248... | ||
245 | WR.Write32LE(File, 0); |
248 | WR.Write32LE(0); |
246 | 249 | ||
247 | PE32.WriteName(File, szversion); |
250 | PE32.WriteName(szversion); |
248 | CHL.WriteToFile(File, program.export); |
251 | CHL.WriteToFile(program.export); |
249 | 252 | ||
Line 250... | Line 253... | ||
250 | FOR i := 0 TO ILen - 1 DO |
253 | FOR i := 0 TO ILen - 1 DO |
251 | WR.Write32LE(File, CHL.GetInt(ImportTable, i)) |
254 | WR.Write32LE(CHL.GetInt(ImportTable, i)) |
Line 252... | Line 255... | ||
252 | END; |
255 | END; |
253 | 256 | ||
Line 254... | Line 257... | ||
254 | CHL.WriteToFile(File, program.import); |
257 | CHL.WriteToFile(program._import); |
Line 255... | Line -... | ||
255 | - | ||
256 | Reloc(program, File); |
258 | |
257 | - | ||
258 | n := 0; |
- | |
259 | exp := program.exp_list.first(BIN.EXPRT); |
259 | Reloc(program); |
260 | WHILE exp # NIL DO |
- | |
261 | WriteReloc(File, n, 3, 6); |
260 | |
Line 262... | Line 261... | ||
262 | INC(n, 4); |
261 | n := 0; |
263 | 262 | exp := program.exp_list.first(BIN.EXPRT); |
|
264 | WriteReloc(File, n, 1, 6); |
263 | WHILE exp # NIL DO |
265 | INC(n, 4); |
264 | WriteReloc(n, 3, 6); |
266 | 265 | INC(n, 4); |
|
Line 267... | Line 266... | ||
267 | exp := exp.next(BIN.EXPRT) |
266 | |
268 | END; |
267 | WriteReloc(n, 1, 6); |
Line 269... | Line 268... | ||
269 | 268 | INC(n, 4); |
|
270 | WriteReloc(File, n, 3, 6); |
269 | |
Line 271... | Line 270... | ||
271 | 270 | exp := exp.next(BIN.EXPRT) |
|
272 | i := 0; |
271 | END; |
Line 273... | Line 272... | ||
273 | WHILE i < LibCount * 2 DO |
272 | |
274 | WriteReloc(File, i * SIZE_OF_DWORD, 4, 6); |
273 | WriteReloc(n, 3, 6); |
Line 275... | Line 274... | ||
275 | INC(i); |
274 | |
276 | WriteReloc(File, i * SIZE_OF_DWORD, 4, 6); |
275 | FOR i := 0 TO LibCount * 2 - 1 DO |
Line 277... | Line 276... | ||
277 | INC(i) |
276 | WriteReloc(i * SIZE_OF_DWORD, 4, 6) |
278 | END; |
277 | END; |
Line 279... | Line 278... | ||
279 | 278 | ||
Line 280... | Line 279... | ||
280 | FOR i := LibCount * 2 TO ILen - 1 DO |
279 | FOR i := LibCount * 2 TO ILen - 1 DO |
281 | IF CHL.GetInt(ImportTable, i) # 0 THEN |
280 | IF CHL.GetInt(ImportTable, i) # 0 THEN |
Line 282... | Line 281... | ||
282 | WriteReloc(File, i * SIZE_OF_DWORD, 4, 6) |
281 | WriteReloc(i * SIZE_OF_DWORD, 4, 6) |
283 | END |
282 | END |