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 |