Changeset 596e5fa in rtems-tools


Ignore:
Timestamp:
Nov 18, 2012, 11:37:37 PM (7 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
9b66527
Parents:
1976825
Message:

Add set_header support to the ELF files.

Location:
linkers
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-elf-types.h

    r1976825 r596e5fa  
    3737     * Hide the types from libelf we use.
    3838     */
     39    typedef ::GElf_Half  elf_half;
    3940    typedef ::GElf_Word  elf_word;
    4041    typedef ::GElf_Xword elf_xword;
  • linkers/rld-elf.cpp

    r1976825 r596e5fa  
    212212        oclass (0),
    213213        ident_str (0),
    214         ident_size (0)
    215     {
    216       memset (&ehdr, 0, sizeof (ehdr));
    217       memset (&phdr, 0, sizeof (phdr));
     214        ident_size (0),
     215        ehdr (0),
     216        phdr (0)
     217    {
    218218    }
    219219
     
    348348      ident_str = 0;
    349349      ident_size = 0;
    350       memset (&ehdr, 0, sizeof (ehdr));
    351       memset (&phdr, 0, sizeof (phdr));
     350
     351      if (!writable)
     352      {
     353        if (ehdr)
     354        {
     355          delete ehdr;
     356          ehdr = 0;
     357        }
     358        if (phdr)
     359        {
     360          delete phdr;
     361          phdr = 0;
     362        }
     363      }
     364
     365      writable = false;
     366
    352367      stab.clear ();
    353368      secs.clear ();
     
    359374      check ("get_header");
    360375
    361       if (::gelf_getehdr (elf_, &ehdr) == NULL)
     376      if (!writable && !ehdr)
     377        ehdr = new elf_ehdr;
     378
     379      if (::gelf_getehdr (elf_, ehdr) == NULL)
    362380        error ("get-header");
    363381    }
     
    366384    file::machinetype () const
    367385    {
    368       check ("machinetype");
    369       return ehdr.e_machine;
     386      check_ehdr ("machinetype");
     387      return ehdr->e_machine;
    370388    }
    371389
     
    373391    file::type () const
    374392    {
    375       check ("type");
    376       return ehdr.e_type;
     393      check_ehdr ("type");
     394      return ehdr->e_type;
    377395    }
    378396
     
    403421    file::is_executable () const
    404422    {
    405       check ("is_executable");
    406       return ehdr.e_type != ET_REL;
     423      check_ehdr ("is_executable");
     424      return ehdr->e_type != ET_REL;
    407425    }
    408426
     
    410428    file::is_relocatable() const
    411429    {
    412       check ("is_relocatable");
    413       return ehdr.e_type == ET_REL;
     430      check_ehdr ("is_relocatable");
     431      return ehdr->e_type == ET_REL;
    414432    }
    415433
     
    417435    file::section_count () const
    418436    {
    419       check ("section_count");
    420       return ehdr.e_shnum;
     437      check_ehdr ("section_count");
     438      return ehdr->e_shnum;
    421439    }
    422440
     
    550568    file::strings_section () const
    551569    {
    552       check ("strings_sections");
    553       return ehdr.e_shstrndx;
     570      check_ehdr ("strings_sections");
     571      return ehdr->e_shstrndx;
    554572    }
    555573
     
    574592    }
    575593
    576 #if 0
    577     void
    578     file::set_header (xxx)
    579     {
    580       elf_ehdr* ehdr_ = ::gelf_newehdr (elf_);
    581 
    582       if (ehdr == NULL)
     594    void
     595    file::set_header (elf_half      type,
     596                      int           class_,
     597                      elf_half      machinetype,
     598                      unsigned char datatype)
     599    {
     600      check_writable ("set_header");
     601
     602      ehdr = (elf_ehdr*) ::gelf_newehdr (elf_, class_);
     603
     604      if (ehdr == 0)
    583605        error ("set-header");
    584606
    585       ehdr->xx = xx;
    586 
    587       ::gelf_flagphdr (elf_, ELF_C_SET , ELF_F_DIRTY);
    588     }
    589 #endif
     607      ehdr->e_type = type;
     608      ehdr->e_machine = machinetype;
     609      ehdr->e_ident[EI_DATA] = datatype;
     610
     611      //::gelf_flagphdr (elf_, ELF_C_SET , ELF_F_DIRTY);
     612    }
    590613
    591614    elf*
     
    613636      {
    614637        std::string w = where;
    615         throw rld::error ("no elf file or header", "elf:file:" + w);
     638        throw rld::error ("no elf file or file descriptor", "elf:file:" + w);
     639      }
     640    }
     641
     642    void
     643    file::check_ehdr (const char* where) const
     644    {
     645      check (where);
     646      if (!ehdr)
     647      {
     648        std::string w = where;
     649        throw rld::error ("no elf header", "elf:file:" + w);
     650      }
     651    }
     652
     653    void
     654    file::check_phdr (const char* where) const
     655    {
     656      check (where);
     657      if (!phdr)
     658      {
     659        std::string w = where;
     660        throw rld::error ("no elf program header", "elf:file:" + w);
    616661      }
    617662    }
  • linkers/rld-elf.h

    r1976825 r596e5fa  
    299299
    300300      /**
     301       * Set the ELF header. Must be writable.
     302       *
     303       * @param type The type of ELF file, ie executable, relocatable etc.
     304       * @param machinetype The type of machine code present in the ELF file.
     305       * @param datatype The data type, ie LSB or MSB.
     306       */
     307      void set_header (elf_half      type,
     308                       int           class_,
     309                       elf_half      machinetype,
     310                       unsigned char datatype);
     311
     312      /**
    301313       * Get the ELF reference.
    302314       */
     
    343355       */
    344356      void check_writable (const char* where) const;
     357
     358      /**
     359       * Check if the ELF header is valid. Throw an exception if not.
     360       *
     361       * @param where Where the check is performed.
     362       */
     363      void check_ehdr (const char* where) const;
     364
     365      /**
     366       * Check if the ELF program header is valid. Throw an exception if not.
     367       *
     368       * @param where Where the check is performed.
     369       */
     370      void check_phdr (const char* where) const;
    345371
    346372      /**
     
    360386      const char*          ident_str;  //< The ELF file's ident string.
    361387      size_t               ident_size; //< The size of the ident.
    362       elf_ehdr             ehdr;       //< The ELF header.
    363       elf_phdr             phdr;       //< The ELF program header.
     388      elf_ehdr*            ehdr;       //< The ELF header.
     389      elf_phdr*            phdr;       //< The ELF program header.
    364390      std::string          stab;       //< The string table.
    365391      sections             secs;       //< The sections.
  • linkers/rld-files.cpp

    r1976825 r596e5fa  
    879879
    880880    void
    881     object::open ()
     881    object::open (bool writable)
    882882    {
    883883      if (archive_)
     884      {
     885        if (writable)
     886          throw rld_error_at ("object files in archives are not writable");
    884887        archive_->open ();
     888      }
    885889      else
    886         image::open ();
     890        image::open (writable);
    887891    }
    888892
  • linkers/rld-files.h

    r1976825 r596e5fa  
    518518       * Open the object file.
    519519       */
    520       virtual void open ();
     520      virtual void open (bool writable = false);
    521521
    522522      /**
Note: See TracChangeset for help on using the changeset viewer.