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 7693
Line 5... Line 5...
5
    All rights reserved.
5
    All rights reserved.
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE ELF;
8
MODULE ELF;
Line 9... Line 9...
9
 
9
 
Line 10... Line 10...
10
IMPORT BIN, WR := WRITER, CHL := CHUNKLISTS;
10
IMPORT BIN, WR := WRITER, CHL := CHUNKLISTS, LISTS;
Line 66... Line 66...
66
        p_flags,
66
        p_flags,
67
        p_align: INTEGER
67
        p_align: INTEGER
Line 68... Line 68...
68
 
68
 
Line -... Line 69...
-
 
69
    END;
-
 
70
 
-
 
71
 
-
 
72
    Elf32_Dyn = POINTER TO RECORD (LISTS.ITEM)
-
 
73
 
-
 
74
        d_tag, d_val: INTEGER
-
 
75
 
-
 
76
    END;
-
 
77
 
-
 
78
 
-
 
79
    Elf32_Sym = POINTER TO RECORD (LISTS.ITEM)
-
 
80
 
-
 
81
        name, value, size: INTEGER;
-
 
82
        info, other: CHAR;
-
 
83
        shndx: WCHAR
-
 
84
 
-
 
85
    END;
69
    END;
86
 
Line -... Line 87...
-
 
87
 
-
 
88
    FILE = WR.FILE;
-
 
89
 
-
 
90
 
-
 
91
VAR
-
 
92
 
-
 
93
    dynamic: LISTS.LIST;
-
 
94
    strtab:  CHL.BYTELIST;
-
 
95
    symtab:  LISTS.LIST;
70
 
96
 
71
    FILE = WR.FILE;
97
    hashtab, bucket, chain: CHL.INTLIST;
72
 
98
 
73
 
99
 
74
PROCEDURE align (n, _align: INTEGER): INTEGER;
100
PROCEDURE align (n, _align: INTEGER): INTEGER;
Line 134... Line 160...
134
        reloc := reloc.next(BIN.RELOC)
160
        reloc := reloc.next(BIN.RELOC)
135
    END;
161
    END;
136
END fixup;
162
END fixup;
Line -... Line 163...
-
 
163
 
-
 
164
 
-
 
165
PROCEDURE NewDyn (tag, val: INTEGER);
-
 
166
VAR
-
 
167
    dyn: Elf32_Dyn;
-
 
168
 
-
 
169
BEGIN
-
 
170
    NEW(dyn);
-
 
171
    dyn.d_tag := tag;
-
 
172
    dyn.d_val := val;
-
 
173
    LISTS.push(dynamic, dyn)
-
 
174
END NewDyn;
-
 
175
 
-
 
176
 
-
 
177
PROCEDURE NewSym (name, value, size: INTEGER; info, other: CHAR; shndx: WCHAR);
-
 
178
VAR
-
 
179
    sym: Elf32_Sym;
-
 
180
 
-
 
181
BEGIN
-
 
182
    NEW(sym);
-
 
183
    sym.name := name;
-
 
184
    sym.value := value;
-
 
185
    sym.size := size;
-
 
186
    sym.info := info;
-
 
187
    sym.other := other;
-
 
188
    sym.shndx := shndx;
-
 
189
 
-
 
190
    LISTS.push(symtab, sym)
-
 
191
END NewSym;
-
 
192
 
-
 
193
 
-
 
194
PROCEDURE HashStr (name: ARRAY OF CHAR): INTEGER;
-
 
195
VAR
-
 
196
    i, h: INTEGER;
-
 
197
    g: SET;
-
 
198
 
-
 
199
BEGIN
-
 
200
    h := 0;
-
 
201
    i := 0;
-
 
202
    WHILE name[i] # 0X DO
-
 
203
        h := h * 16 + ORD(name[i]);
-
 
204
        g := BITS(h) * {28..31};
-
 
205
        h := ORD(BITS(h) / BITS(LSR(ORD(g), 24)) - g);
-
 
206
        INC(i)
-
 
207
    END
-
 
208
 
-
 
209
    RETURN h
-
 
210
END HashStr;
-
 
211
 
-
 
212
 
-
 
213
PROCEDURE MakeHash (bucket, chain: CHL.INTLIST; symCount: INTEGER);
-
 
214
VAR
-
 
215
    symi, hi, k: INTEGER;
-
 
216
 
-
 
217
BEGIN
-
 
218
    FOR symi := 0 TO symCount - 1 DO
-
 
219
        CHL.SetInt(chain, symi, 0);
-
 
220
        hi := CHL.GetInt(hashtab, symi) MOD symCount;
-
 
221
        IF CHL.GetInt(bucket, hi) # 0 THEN
-
 
222
            k := symi;
-
 
223
            WHILE CHL.GetInt(chain, k) # 0 DO
-
 
224
                k := CHL.GetInt(chain, k)
-
 
225
            END;
-
 
226
            CHL.SetInt(chain, k, CHL.GetInt(bucket, hi))
-
 
227
        END;
-
 
228
        CHL.SetInt(bucket, hi, symi)
-
 
229
    END
-
 
230
END MakeHash;
137
 
231
 
138
 
232
 
139
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; amd64: BOOLEAN);
233
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; fini: INTEGER; so, amd64: BOOLEAN);
140
CONST
234
CONST
141
    interp  =  0;
235
    interp  =  0;
142
    dyn     =  1;
236
    dyn     =  1;
143
    header  =  2;
237
    header  =  2;
144
    text    =  3;
238
    text    =  3;
Line -... Line 239...
-
 
239
    data    =  4;
-
 
240
    bss     =  5;
-
 
241
 
-
 
242
    linuxInterpreter64 = "/lib64/ld-linux-x86-64.so.2";
-
 
243
    linuxInterpreter32 = "/lib/ld-linux.so.2";
-
 
244
 
-
 
245
    exeBaseAddress32 = 8048000H;
-
 
246
    exeBaseAddress64 = 400000H;
-
 
247
    dllBaseAddress = 0;
-
 
248
 
-
 
249
    DT_NULL = 0;
-
 
250
    DT_NEEDED = 1;
-
 
251
    DT_HASH = 4;
-
 
252
    DT_STRTAB = 5;
-
 
253
    DT_SYMTAB = 6;
-
 
254
    DT_RELA = 7;
-
 
255
    DT_RELASZ = 8;
-
 
256
    DT_RELAENT = 9;
-
 
257
    DT_STRSZ = 10;
-
 
258
    DT_SYMENT = 11;
-
 
259
    DT_INIT = 12;
-
 
260
    DT_FINI = 13;
-
 
261
    DT_SONAME = 14;
-
 
262
    DT_REL = 17;
145
    data    =  4;
263
    DT_RELSZ = 18;
146
    bss     =  5;
264
    DT_RELENT = 19;
147
 
265
 
Line 148... Line 266...
148
VAR
266
VAR
Line 149... Line 267...
149
    ehdr: Elf32_Ehdr;
267
    ehdr: Elf32_Ehdr;
Line -... Line 268...
-
 
268
    phdr: ARRAY 16 OF Elf32_Phdr;
-
 
269
 
150
    phdr: ARRAY 16 OF Elf32_Phdr;
270
    i, BaseAdr, offset, pad, VA, symCount: INTEGER;
Line 151... Line 271...
151
 
271
 
-
 
272
    SizeOf: RECORD header, code, data, bss: INTEGER END;
-
 
273
 
-
 
274
    Offset: RECORD symtab, reltab, hash, strtab, dyn: INTEGER END;
152
    i, LoadAdr, offset, pad, VA: INTEGER;
275
 
Line 153... Line 276...
153
 
276
    File: FILE;
-
 
277
 
-
 
278
    Interpreter: ARRAY 40 OF CHAR; lenInterpreter: INTEGER;
-
 
279
 
-
 
280
    item: LISTS.ITEM;
154
    SizeOf: RECORD header, code, data, bss: INTEGER END;
281
 
-
 
282
    Name: ARRAY 2048 OF CHAR;
155
 
283
 
156
    File: FILE;
284
BEGIN
157
 
285
    dynamic := LISTS.create(NIL);
-
 
286
    symtab  := LISTS.create(NIL);
158
    str: ARRAY 40 OF CHAR; lstr: INTEGER;
287
    strtab  := CHL.CreateByteList();
159
    Dyn: ARRAY 350 OF BYTE;
-
 
Line 160... Line 288...
160
 
288
 
161
BEGIN
-
 
162
    IF amd64 THEN
-
 
163
        str := "/lib64/ld-linux-x86-64.so.2"
289
    IF amd64 THEN
164
    ELSE
290
        BaseAdr := exeBaseAddress64;
Line -... Line 291...
-
 
291
        Interpreter := linuxInterpreter64
-
 
292
    ELSE
165
        str := "/lib/ld-linux.so.2"
293
        BaseAdr := exeBaseAddress32;
166
    END;
294
        Interpreter := linuxInterpreter32
167
    lstr := LENGTH(str);
295
    END;
Line 168... Line 296...
168
 
296
 
Line 190... Line 318...
190
    ehdr.e_ident[7] := 3;
318
    ehdr.e_ident[7] := 3;
191
    FOR i := 8 TO EI_NIDENT - 1 DO
319
    FOR i := 8 TO EI_NIDENT - 1 DO
192
        ehdr.e_ident[i] := 0
320
        ehdr.e_ident[i] := 0
193
    END;
321
    END;
Line -... Line 322...
-
 
322
 
-
 
323
    IF so THEN
-
 
324
        ehdr.e_type := WCHR(ET_DYN)
194
 
325
    ELSE
-
 
326
        ehdr.e_type := WCHR(ET_EXEC)
-
 
327
    END;
195
    ehdr.e_type := WCHR(ET_EXEC);
328
 
196
    ehdr.e_version := 1;
329
    ehdr.e_version := 1;
197
    ehdr.e_shoff := 0;
330
    ehdr.e_shoff := 0;
198
    ehdr.e_flags := 0;
331
    ehdr.e_flags := 0;
199
    ehdr.e_shnum := WCHR(0);
332
    ehdr.e_shnum := WCHR(0);
Line 216... Line 349...
216
 
349
 
Line 217... Line 350...
217
    SizeOf.header := ORD(ehdr.e_ehsize) + ORD(ehdr.e_phentsize) * ORD(ehdr.e_phnum);
350
    SizeOf.header := ORD(ehdr.e_ehsize) + ORD(ehdr.e_phentsize) * ORD(ehdr.e_phnum);
218
 
351
 
219
    phdr[interp].p_type := 3;
352
    phdr[interp].p_type := 3;
220
    phdr[interp].p_offset := SizeOf.header;
353
    phdr[interp].p_offset := SizeOf.header;
221
    phdr[interp].p_vaddr := LoadAdr + phdr[interp].p_offset;
354
    phdr[interp].p_vaddr := BaseAdr + phdr[interp].p_offset;
222
    phdr[interp].p_paddr := LoadAdr + phdr[interp].p_offset;
355
    phdr[interp].p_paddr := phdr[interp].p_vaddr;
223
    phdr[interp].p_filesz := lstr + 1;
356
    phdr[interp].p_filesz := lenInterpreter;
224
    phdr[interp].p_memsz := lstr + 1;
357
    phdr[interp].p_memsz := lenInterpreter;
Line 225... Line 358...
225
    phdr[interp].p_flags := PF_R;
358
    phdr[interp].p_flags := PF_R;
226
    phdr[interp].p_align := 1;
359
    phdr[interp].p_align := 1;
227
 
360
 
228
    phdr[dyn].p_type := 2;
361
    phdr[dyn].p_type := 2;
-
 
362
    phdr[dyn].p_offset := phdr[interp].p_offset + phdr[interp].p_filesz;
-
 
363
    phdr[dyn].p_vaddr := BaseAdr + phdr[dyn].p_offset;
-
 
364
    phdr[dyn].p_paddr := phdr[dyn].p_vaddr;
-
 
365
 
-
 
366
    hashtab := CHL.CreateIntList();
-
 
367
 
-
 
368
    CHL.PushInt(hashtab, HashStr(""));
-
 
369
    NewSym(CHL.PushStr(strtab, ""), 0, 0, 0X, 0X, 0X);
-
 
370
    CHL.PushInt(hashtab, HashStr("dlopen"));
-
 
371
    NewSym(CHL.PushStr(strtab, "dlopen"), 0, 0, 12X, 0X, 0X);
-
 
372
    CHL.PushInt(hashtab, HashStr("dlsym"));
-
 
373
    NewSym(CHL.PushStr(strtab, "dlsym"), 0, 0, 12X, 0X, 0X);
-
 
374
 
-
 
375
    IF so THEN
-
 
376
        item := program.exp_list.first;
-
 
377
        WHILE item # NIL DO
-
 
378
            ASSERT(CHL.GetStr(program.export, item(BIN.EXPRT).nameoffs, Name));
-
 
379
            CHL.PushInt(hashtab, HashStr(Name));
-
 
380
            NewSym(CHL.PushStr(strtab, Name), item(BIN.EXPRT).label, 0, 12X, 0X, 0X);
-
 
381
            item := item.next
-
 
382
        END;
-
 
383
        ASSERT(CHL.GetStr(program.data, program.modname, Name))
-
 
384
    END;
-
 
385
 
-
 
386
    symCount := LISTS.count(symtab);
-
 
387
 
-
 
388
    bucket  := CHL.CreateIntList();
-
 
389
    chain   := CHL.CreateIntList();
-
 
390
 
-
 
391
    FOR i := 1 TO symCount DO
-
 
392
        CHL.PushInt(bucket, 0);
-
 
393
        CHL.PushInt(chain, 0)
-
 
394
    END;
-
 
395
 
-
 
396
    MakeHash(bucket, chain, symCount);
-
 
397
 
-
 
398
    NewDyn(DT_NEEDED, CHL.PushStr(strtab, "libdl.so.2"));
-
 
399
    NewDyn(DT_STRTAB, 0);
229
    phdr[dyn].p_offset := phdr[interp].p_offset + phdr[interp].p_filesz;
400
    NewDyn(DT_STRSZ, CHL.Length(strtab));
-
 
401
    NewDyn(DT_SYMTAB, 0);
230
    phdr[dyn].p_vaddr := LoadAdr + phdr[dyn].p_offset;
402
 
231
    phdr[dyn].p_paddr := LoadAdr + phdr[dyn].p_offset;
403
    IF amd64 THEN
-
 
404
        NewDyn(DT_SYMENT, 24);
232
    IF amd64 THEN
405
        NewDyn(DT_RELA, 0);
-
 
406
        NewDyn(DT_RELASZ, 48);
-
 
407
        NewDyn(DT_RELAENT, 24)
-
 
408
    ELSE
-
 
409
        NewDyn(DT_SYMENT, 16);
-
 
410
        NewDyn(DT_REL, 0);
-
 
411
        NewDyn(DT_RELSZ, 16);
-
 
412
        NewDyn(DT_RELENT, 8)
-
 
413
    END;
-
 
414
 
-
 
415
    NewDyn(DT_HASH, 0);
233
        phdr[dyn].p_filesz := 0A0H;
416
 
234
        phdr[dyn].p_memsz  := 0A0H
417
    IF so THEN
235
    ELSE
418
        NewDyn(DT_SONAME, CHL.PushStr(strtab, Name));
-
 
419
        NewDyn(DT_INIT, 0);
-
 
420
        NewDyn(DT_FINI, 0)
-
 
421
    END;
-
 
422
 
-
 
423
    NewDyn(DT_NULL, 0);
-
 
424
 
-
 
425
    Offset.symtab := LISTS.count(dynamic) * (8 + 8 * ORD(amd64));
-
 
426
    Offset.reltab := Offset.symtab + symCount * (16 + 8 * ORD(amd64));
-
 
427
    Offset.hash   := Offset.reltab + (8 + 16 * ORD(amd64)) * 2;
-
 
428
    Offset.strtab := Offset.hash + (symCount * 2 + 2) * 4;
-
 
429
 
-
 
430
    Offset.dyn := phdr[dyn].p_offset;
-
 
431
 
-
 
432
    item := LISTS.getidx(dynamic, 1); item(Elf32_Dyn).d_val := Offset.strtab + Offset.dyn + BaseAdr;
-
 
433
    item := LISTS.getidx(dynamic, 3); item(Elf32_Dyn).d_val := Offset.symtab + Offset.dyn + BaseAdr;
-
 
434
    item := LISTS.getidx(dynamic, 5); item(Elf32_Dyn).d_val := Offset.reltab + Offset.dyn + BaseAdr;
-
 
435
    item := LISTS.getidx(dynamic, 8); item(Elf32_Dyn).d_val := Offset.hash   + Offset.dyn + BaseAdr;
-
 
436
 
236
        phdr[dyn].p_filesz := 50H;
437
    phdr[dyn].p_filesz := Offset.strtab + CHL.Length(strtab) + 8 + 8 * ORD(amd64);
237
        phdr[dyn].p_memsz  := 50H
438
    phdr[dyn].p_memsz  := phdr[dyn].p_filesz;
Line 238... Line 439...
238
    END;
439
 
Line 239... Line 440...
239
    phdr[dyn].p_flags := PF_R;
440
    phdr[dyn].p_flags := PF_R;
240
    phdr[dyn].p_align := 1;
441
    phdr[dyn].p_align := 1;
241
 
442
 
242
    offset := 0;
443
    offset := 0;
243
 
-
 
244
    phdr[header].p_type := 1;
-
 
245
    phdr[header].p_offset := offset;
-
 
246
    phdr[header].p_vaddr := LoadAdr;
-
 
247
    phdr[header].p_paddr := LoadAdr;
444
 
248
    IF amd64 THEN
445
    phdr[header].p_type := 1;
249
        phdr[header].p_filesz := 305H;
-
 
250
        phdr[header].p_memsz  := 305H
446
    phdr[header].p_offset := offset;
251
    ELSE
447
    phdr[header].p_vaddr := BaseAdr;
Line 252... Line 448...
252
        phdr[header].p_filesz := 1D0H;
448
    phdr[header].p_paddr := BaseAdr;
253
        phdr[header].p_memsz  := 1D0H
449
    phdr[header].p_filesz := 244 + 156 * ORD(amd64) + lenInterpreter + phdr[dyn].p_filesz;
Line 254... Line 450...
254
    END;
450
    phdr[header].p_memsz  := phdr[header].p_filesz;
255
    phdr[header].p_flags := PF_R + PF_W;
451
    phdr[header].p_flags := PF_R + PF_W;
256
    phdr[header].p_align := 1000H;
452
    phdr[header].p_align := 1000H;
257
    
453
 
Line 268... Line 464...
268
    phdr[text].p_align := 1000H;
464
    phdr[text].p_align := 1000H;
Line 269... Line 465...
269
 
465
 
Line 270... Line 466...
270
    ehdr.e_entry := phdr[text].p_vaddr;
466
    ehdr.e_entry := phdr[text].p_vaddr;
271
    
467
 
272
    offset := offset + phdr[text].p_filesz;
468
    offset := offset + phdr[text].p_filesz;
Line 273... Line 469...
273
    VA := LoadAdr + offset + 2000H;
469
    VA := BaseAdr + offset + 2000H;
274
    pad := (16 - VA MOD 16) MOD 16;
470
    pad := (16 - VA MOD 16) MOD 16;
275
 
471
 
Line 281... Line 477...
281
    phdr[data].p_memsz := SizeOf.data + pad;
477
    phdr[data].p_memsz := SizeOf.data + pad;
282
    phdr[data].p_flags := PF_R + PF_W;
478
    phdr[data].p_flags := PF_R + PF_W;
283
    phdr[data].p_align := 1000H;
479
    phdr[data].p_align := 1000H;
Line 284... Line 480...
284
                    
480
 
285
    offset := offset + phdr[data].p_filesz;
481
    offset := offset + phdr[data].p_filesz;
Line 286... Line 482...
286
    VA := LoadAdr + offset + 3000H;
482
    VA := BaseAdr + offset + 3000H;
287
 
483
 
288
    phdr[bss].p_type := 1;
484
    phdr[bss].p_type := 1;
289
    phdr[bss].p_offset := offset;
485
    phdr[bss].p_offset := offset;
290
    phdr[bss].p_vaddr := VA;
486
    phdr[bss].p_vaddr := VA;
291
    phdr[bss].p_paddr := VA;
487
    phdr[bss].p_paddr := VA;
292
    phdr[bss].p_filesz := 0;
488
    phdr[bss].p_filesz := 0;
293
    phdr[bss].p_memsz := SizeOf.bss + 16;
489
    phdr[bss].p_memsz := SizeOf.bss + 16;
Line 294... Line 490...
294
    phdr[bss].p_flags := PF_R + PF_W;
490
    phdr[bss].p_flags := PF_R + PF_W;
-
 
491
    phdr[bss].p_align := 1000H;
-
 
492
 
-
 
493
    fixup(program, ehdr.e_entry, phdr[data].p_vaddr + pad, align(phdr[bss].p_vaddr, 16), amd64);
-
 
494
 
-
 
495
    item := symtab.first;
-
 
496
    WHILE item # NIL DO
-
 
497
        IF item(Elf32_Sym).value # 0 THEN
-
 
498
            INC(item(Elf32_Sym).value, ehdr.e_entry)
-
 
499
        END;
-
 
500
        item := item.next
-
 
501
    END;
-
 
502
 
-
 
503
    IF so THEN
Line 295... Line 504...
295
    phdr[bss].p_align := 1000H;
504
        item := LISTS.getidx(dynamic, 10); item(Elf32_Dyn).d_val := ehdr.e_entry;
Line 296... Line 505...
296
 
505
        item := LISTS.getidx(dynamic, 11); item(Elf32_Dyn).d_val := BIN.GetLabel(program, fini) + ehdr.e_entry
297
    fixup(program, phdr[text].p_vaddr, phdr[data].p_vaddr + pad, align(phdr[bss].p_vaddr, 16), amd64);
506
    END;
Line 338... Line 547...
338
        WritePH(File, phdr[text]);
547
        WritePH(File, phdr[text]);
339
        WritePH(File, phdr[data]);
548
        WritePH(File, phdr[data]);
340
        WritePH(File, phdr[bss])
549
        WritePH(File, phdr[bss])
341
    END;
550
    END;
Line 342... Line 551...
342
 
551
 
343
    FOR i := 0 TO lstr DO
552
    FOR i := 0 TO lenInterpreter - 1 DO
344
        WR.WriteByte(File, ORD(str[i]))
553
        WR.WriteByte(File, ORD(Interpreter[i]))
Line 345... Line 554...
345
    END;
554
    END;
346
 
555
 
-
 
556
    i := 0;
-
 
557
    IF amd64 THEN
347
    i := 0;
558
        item := dynamic.first;
348
    IF amd64 THEN
559
        WHILE item # NIL DO
-
 
560
            WR.Write64LE(File, item(Elf32_Dyn).d_tag);
-
 
561
            WR.Write64LE(File, item(Elf32_Dyn).d_val);
-
 
562
            item := item.next
-
 
563
        END;
-
 
564
 
349
        BIN.InitArray(Dyn, i, "01000000000000000E000000000000000500000000000000DC02400000000000");
565
        item := symtab.first;
350
        BIN.InitArray(Dyn, i, "0A00000000000000190000000000000006000000000000004C02400000000000");
566
        WHILE item # NIL DO
351
        BIN.InitArray(Dyn, i, "0B00000000000000180000000000000007000000000000009402400000000000");
567
            WR.Write32LE(File, item(Elf32_Sym).name);
352
        BIN.InitArray(Dyn, i, "0800000000000000300000000000000009000000000000001800000000000000");
568
            WR.WriteByte(File, ORD(item(Elf32_Sym).info));
353
        BIN.InitArray(Dyn, i, "0400000000000000C40240000000000000000000000000000000000000000000");
569
            WR.WriteByte(File, ORD(item(Elf32_Sym).other));
354
        BIN.InitArray(Dyn, i, "0000000000000000000000000000000000000000000000000100000012000000");
570
            Write16(File, item(Elf32_Sym).shndx);
-
 
571
            WR.Write64LE(File, item(Elf32_Sym).value);
-
 
572
            WR.Write64LE(File, item(Elf32_Sym).size);
-
 
573
            item := item.next
355
        BIN.InitArray(Dyn, i, "0000000000000000000000000000000008000000120000000000000000000000");
574
        END;
-
 
575
 
-
 
576
        WR.Write64LE(File, phdr[dyn].p_filesz + Offset.dyn + BaseAdr - 16);
-
 
577
        WR.Write32LE(File, 1);
356
        BIN.InitArray(Dyn, i, "0000000000000000F50240000000000001000000010000000000000000000000");
578
        WR.Write32LE(File, 1);
-
 
579
        WR.Write64LE(File, 0);
-
 
580
        WR.Write64LE(File, phdr[dyn].p_filesz + Offset.dyn + BaseAdr - 8);
-
 
581
        WR.Write32LE(File, 1);
-
 
582
        WR.Write32LE(File, 2);
-
 
583
        WR.Write64LE(File, 0);
-
 
584
 
-
 
585
        WR.Write32LE(File, symCount);
-
 
586
        WR.Write32LE(File, symCount);
357
        BIN.InitArray(Dyn, i, "FD02400000000000010000000200000000000000000000000100000003000000");
587
 
-
 
588
        FOR i := 0 TO symCount - 1 DO
-
 
589
            WR.Write32LE(File, CHL.GetInt(bucket, i))
-
 
590
        END;
-
 
591
 
-
 
592
        FOR i := 0 TO symCount - 1 DO
-
 
593
            WR.Write32LE(File, CHL.GetInt(chain, i))
-
 
594
        END;
-
 
595
 
-
 
596
        CHL.WriteToFile(File, strtab);
-
 
597
        WR.Write64LE(File, 0);
358
        BIN.InitArray(Dyn, i, "0000000001000000020000000000000000646C6F70656E00646C73796D006C69");
598
        WR.Write64LE(File, 0)
-
 
599
 
-
 
600
    ELSE
359
        BIN.InitArray(Dyn, i, "62646C2E736F2E320000000000000000000000000000000000")
601
        item := dynamic.first;
360
    ELSE
602
        WHILE item # NIL DO
-
 
603
            WR.Write32LE(File, item(Elf32_Dyn).d_tag);
-
 
604
            WR.Write32LE(File, item(Elf32_Dyn).d_val);
-
 
605
            item := item.next
-
 
606
        END;
-
 
607
 
-
 
608
        item := symtab.first;
361
        BIN.InitArray(Dyn, i, "010000000E00000005000000AF8104080A000000190000000600000057810408");
609
        WHILE item # NIL DO
362
        BIN.InitArray(Dyn, i, "0B00000010000000110000008781040812000000100000001300000008000000");
610
            WR.Write32LE(File, item(Elf32_Sym).name);
363
        BIN.InitArray(Dyn, i, "0400000097810408000000000000000000000000000000000000000000000000");
611
            WR.Write32LE(File, item(Elf32_Sym).value);
364
        BIN.InitArray(Dyn, i, "0100000000000000000000001200000008000000000000000000000012000000");
612
            WR.Write32LE(File, item(Elf32_Sym).size);
365
        BIN.InitArray(Dyn, i, "C881040801010000CC8104080102000001000000030000000000000001000000");
613
            WR.WriteByte(File, ORD(item(Elf32_Sym).info));
-
 
614
            WR.WriteByte(File, ORD(item(Elf32_Sym).other));
366
        BIN.InitArray(Dyn, i, "020000000000000000646C6F70656E00646C73796D006C6962646C2E736F2E32");
615
            Write16(File, item(Elf32_Sym).shndx);
Line -... Line 616...
-
 
616
            item := item.next
-
 
617
        END;
-
 
618
 
-
 
619
        WR.Write32LE(File, phdr[dyn].p_filesz + Offset.dyn + BaseAdr - 8);
-
 
620
        WR.Write32LE(File, 00000101H);
-
 
621
        WR.Write32LE(File, phdr[dyn].p_filesz + Offset.dyn + BaseAdr - 4);
367
        BIN.InitArray(Dyn, i, "000000000000000000")
622
        WR.Write32LE(File, 00000201H);
-
 
623
 
-
 
624
        WR.Write32LE(File, symCount);
-
 
625
        WR.Write32LE(File, symCount);
-
 
626
 
-
 
627
        FOR i := 0 TO symCount - 1 DO
-
 
628
            WR.Write32LE(File, CHL.GetInt(bucket, i))
-
 
629
        END;
-
 
630
 
-
 
631
        FOR i := 0 TO symCount - 1 DO
-
 
632
            WR.Write32LE(File, CHL.GetInt(chain, i))
-
 
633
        END;
-
 
634
 
-
 
635
        CHL.WriteToFile(File, strtab);
-
 
636
        WR.Write32LE(File, 0);
Line 368... Line 637...
368
    END;
637
        WR.Write32LE(File, 0)
369
 
638
 
370
    WR.Write(File, Dyn, i);
639
    END;
371
 
640