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 >
Pascal/Delphi Source File  |  2000-08-15  |  4KB  |  142 lines

  1. procedure bearbeite_programmheader;
  2.   var
  3.     z,
  4.     programm_kopf_anzahl    :longint;
  5.     s                :sektionen;
  6.  
  7.   procedure kopiere_pk;
  8.     begin
  9.       pk2[programm_kopf_anzahl]:=programm_kopf[index_];
  10.       Inc(programm_kopf_anzahl);
  11.     end;
  12.  
  13.   procedure erweitere_vorhandenen_oder_kopiere_pk;
  14.     var
  15.       t,
  16.       luecke            :longint;
  17.     begin
  18.       t:=0;
  19.       repeat
  20.         luecke:=programm_kopf[index_].p_vaddr-(pk2[t].p_vaddr+pk2[t].p_filesz);
  21.         if  (programm_kopf[index_].p_flags=pk2[t].p_flags)
  22.         and (0<=luecke) and (luecke<4)
  23.         and (pk2[t].p_type<>PT_INTERP)
  24.          then
  25.           begin
  26.             if programm_kopf[index_].p_filesz>0 then
  27.               Inc(pk2[t].p_filesz,luecke+programm_kopf[index_].p_filesz);
  28.             if programm_kopf[index_].p_memsz >0 then
  29.               Inc(pk2[t].p_memsz ,luecke+programm_kopf[index_].p_memsz );
  30.             Exit;
  31.           end;
  32.  
  33.         Inc(t);
  34.       until t>=programm_kopf_anzahl;
  35.  
  36.       kopiere_pk;
  37.     end;
  38.  
  39.   begin
  40.     elf_kopf.e_phoff:=dateiposition;
  41.  
  42.     FillChar(speicher_tabelle,SizeOf(speicher_tabelle),0); // nil
  43.     for s:=low(s) to high(s) do
  44.       if sektionen_uebersicht[s].vorhanden then
  45.         begin
  46.           index_:=sektionen_uebersicht[s].index_;
  47.           case s of
  48.             sekt_null             :speicher_tabelle[index_]:=nil;
  49.             sekt_interpreter      :speicher_tabelle[index_]:=@programmlader;
  50.             sekt_text             :speicher_tabelle[index_]:=code_puffer;
  51.             sekt_bss              :speicher_tabelle[index_]:=bss_puffer; (* !!!! *)
  52.             sekt_data_a           :speicher_tabelle[index_]:=data_puffer;
  53.             sekt_data_b           :speicher_tabelle[index_]:=nil;
  54.             sekt_dynamic          :speicher_tabelle[index_]:=dynamic_speicher;
  55.             sekt_got              :speicher_tabelle[index_]:=got_speicher;
  56.             sekt_dynsym           :speicher_tabelle[index_]:=symboltabelle;
  57.             sekt_dynsymstr        :speicher_tabelle[index_]:=symbolstringtabelle;
  58.             sekt_dynsymstrhash    :speicher_tabelle[index_]:=hash_tabelle;
  59.             sekt_rel_plt          :speicher_tabelle[index_]:=rel_plt_speicher;
  60.             sekt_resource         :speicher_tabelle[index_]:=reso_puffer;
  61.             sekt_plt              :speicher_tabelle[index_]:=plt_speicher;
  62.             sekt_strings          :speicher_tabelle[index_]:=string_puffer;
  63.           else
  64.             RunError(1);
  65.           end;
  66.         end;
  67.  
  68.  
  69.     programm_kopf_anzahl:=0;
  70.     for s:=low(s) to high(s) do
  71.       if sektionen_uebersicht[s].vorhanden then
  72.         begin
  73.          index_:=sektionen_uebersicht[s].index_;
  74.          case s of
  75.            sekt_null:
  76.              ;
  77.  
  78.            sekt_interpreter:
  79.              kopiere_pk;
  80.  
  81.            sekt_text:
  82.              kopiere_pk;
  83.  
  84.            sekt_bss:
  85.              kopiere_pk;
  86.  
  87.            sekt_data_a:
  88.              kopiere_pk;
  89.  
  90.            sekt_data_b:
  91.              erweitere_vorhandenen_oder_kopiere_pk;
  92.  
  93.            sekt_dynamic:
  94.              begin
  95.                programm_kopf[index_].p_type:=PT_LOAD;
  96.                erweitere_vorhandenen_oder_kopiere_pk;
  97.                programm_kopf[index_].p_type:=PT_DYNAMIC;
  98.                kopiere_pk;
  99.              end;
  100.  
  101.            sekt_got:
  102.              erweitere_vorhandenen_oder_kopiere_pk;
  103.  
  104.            sekt_dynsym:
  105.              erweitere_vorhandenen_oder_kopiere_pk;
  106.  
  107.            sekt_dynsymstr:
  108.              erweitere_vorhandenen_oder_kopiere_pk;
  109.  
  110.            sekt_dynsymstrhash:
  111.              erweitere_vorhandenen_oder_kopiere_pk;
  112.  
  113.            sekt_rel_plt:
  114.              erweitere_vorhandenen_oder_kopiere_pk;
  115.  
  116.            sekt_resource:
  117.              kopiere_pk;
  118.  
  119.            sekt_plt:
  120.              erweitere_vorhandenen_oder_kopiere_pk;
  121.  
  122.            sekt_strings:
  123.              ;
  124.           else
  125.             RunError(1);
  126.           end;
  127.         end;
  128.  
  129.  
  130.     elf_kopf.e_phnum:=programm_kopf_anzahl;
  131.     Inc(dateiposition,elf_kopf.e_phentsize*elf_kopf.e_phnum);
  132.  
  133. //    /// !!!!!!!! z löschen
  134. //    for z:=0 to programm_kopf_anzahl-1 do
  135. //      begin
  136. //        with pk2[z] do
  137. //          DWriteLn(Int2Hex(p_vaddr,8)+'  '+Int2Hex(p_filesz,8)+'  '+Int2Hex(p_memsz,8));
  138. //      end;
  139.  
  140.   end;
  141.  
  142.