home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
vp21beta.zip
/
LRTLSRC.RAR
/
PE2ELF
/
PROGHEAD.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
2000-08-15
|
4KB
|
142 lines
procedure bearbeite_programmheader;
var
z,
programm_kopf_anzahl :longint;
s :sektionen;
procedure kopiere_pk;
begin
pk2[programm_kopf_anzahl]:=programm_kopf[index_];
Inc(programm_kopf_anzahl);
end;
procedure erweitere_vorhandenen_oder_kopiere_pk;
var
t,
luecke :longint;
begin
t:=0;
repeat
luecke:=programm_kopf[index_].p_vaddr-(pk2[t].p_vaddr+pk2[t].p_filesz);
if (programm_kopf[index_].p_flags=pk2[t].p_flags)
and (0<=luecke) and (luecke<4)
and (pk2[t].p_type<>PT_INTERP)
then
begin
if programm_kopf[index_].p_filesz>0 then
Inc(pk2[t].p_filesz,luecke+programm_kopf[index_].p_filesz);
if programm_kopf[index_].p_memsz >0 then
Inc(pk2[t].p_memsz ,luecke+programm_kopf[index_].p_memsz );
Exit;
end;
Inc(t);
until t>=programm_kopf_anzahl;
kopiere_pk;
end;
begin
elf_kopf.e_phoff:=dateiposition;
FillChar(speicher_tabelle,SizeOf(speicher_tabelle),0); // nil
for s:=low(s) to high(s) do
if sektionen_uebersicht[s].vorhanden then
begin
index_:=sektionen_uebersicht[s].index_;
case s of
sekt_null :speicher_tabelle[index_]:=nil;
sekt_interpreter :speicher_tabelle[index_]:=@programmlader;
sekt_text :speicher_tabelle[index_]:=code_puffer;
sekt_bss :speicher_tabelle[index_]:=bss_puffer; (* !!!! *)
sekt_data_a :speicher_tabelle[index_]:=data_puffer;
sekt_data_b :speicher_tabelle[index_]:=nil;
sekt_dynamic :speicher_tabelle[index_]:=dynamic_speicher;
sekt_got :speicher_tabelle[index_]:=got_speicher;
sekt_dynsym :speicher_tabelle[index_]:=symboltabelle;
sekt_dynsymstr :speicher_tabelle[index_]:=symbolstringtabelle;
sekt_dynsymstrhash :speicher_tabelle[index_]:=hash_tabelle;
sekt_rel_plt :speicher_tabelle[index_]:=rel_plt_speicher;
sekt_resource :speicher_tabelle[index_]:=reso_puffer;
sekt_plt :speicher_tabelle[index_]:=plt_speicher;
sekt_strings :speicher_tabelle[index_]:=string_puffer;
else
RunError(1);
end;
end;
programm_kopf_anzahl:=0;
for s:=low(s) to high(s) do
if sektionen_uebersicht[s].vorhanden then
begin
index_:=sektionen_uebersicht[s].index_;
case s of
sekt_null:
;
sekt_interpreter:
kopiere_pk;
sekt_text:
kopiere_pk;
sekt_bss:
kopiere_pk;
sekt_data_a:
kopiere_pk;
sekt_data_b:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_dynamic:
begin
programm_kopf[index_].p_type:=PT_LOAD;
erweitere_vorhandenen_oder_kopiere_pk;
programm_kopf[index_].p_type:=PT_DYNAMIC;
kopiere_pk;
end;
sekt_got:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_dynsym:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_dynsymstr:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_dynsymstrhash:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_rel_plt:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_resource:
kopiere_pk;
sekt_plt:
erweitere_vorhandenen_oder_kopiere_pk;
sekt_strings:
;
else
RunError(1);
end;
end;
elf_kopf.e_phnum:=programm_kopf_anzahl;
Inc(dateiposition,elf_kopf.e_phentsize*elf_kopf.e_phnum);
// /// !!!!!!!! z löschen
// for z:=0 to programm_kopf_anzahl-1 do
// begin
// with pk2[z] do
// DWriteLn(Int2Hex(p_vaddr,8)+' '+Int2Hex(p_filesz,8)+' '+Int2Hex(p_memsz,8));
// end;
end;