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;

