Subversion Repositories Kolibri OS

Rev

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