Changeset 6c94148 in rtems-tools


Ignore:
Timestamp:
Apr 3, 2016, 6:26:36 AM (3 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, master
Children:
3e14594
Parents:
c81066f
Message:

linkers: Demangle the C++ labels in the .ctors/.dtors sections.

Show user friendly labels for the C++ constructors and destructors.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-exeinfo.cpp

    rc81066f r6c94148  
    112112    struct image
    113113    {
    114       files::object    exe;        //< The object file that is the executable.
     114      files::object    exe;       //< The object file that is the executable.
    115115      symbols::table   symbols;   //< The synbols for a map.
    116116      symbols::addrtab addresses; //< The symbols keyed by address.
     
    215215        if (fsec.name == names[n])
    216216        {
    217           section sec (fsec);
    218217          if (rld::verbose () >= RLD_VERBOSE_DETAILS)
    219218            std::cout << "init:section-loader: " << fsec.name
    220219                      << " added" << std::endl;
     220
     221          section sec (fsec);
    221222          img.exe.seek (fsec.offset);
    222223          sec.data.read (img.exe, fsec.size);
     
    343344          std::cout << "  "
    344345                    << std::hex << std::setfill ('0')
    345                     << "0x" << std::setw (8) << address;
     346                    << "0x" << std::setw (8) << address
     347                    << std::dec << std::setfill ('0');
    346348          if (sym)
    347             std::cout << " " << sym->name ();
     349          {
     350            /*
     351             * C++ is adding '_GLOBAL__sub_I_' to the label. If present, strip
     352             * and check the label.
     353             */
     354            std::string label = sym->name ();
     355            if (rld::starts_with (label, "_GLOBAL__sub_I_"))
     356              label = rld::find_replace (label, "_GLOBAL__sub_I_", "");
     357            if (rld::symbols::is_cplusplus (label))
     358              rld::symbols::demangle_name (label, label);
     359            std::cout << " " << label;
     360          }
    348361          else
     362          {
    349363            std::cout << " no symbol";
    350           std::cout << std::dec << std::setfill ('0')
    351                     << std::endl;
     364          }
     365          std::cout << std::endl;
    352366        }
    353367      }
  • rtemstoolkit/rld-symbols.cpp

    rc81066f r6c94148  
    3838     * Get the demangled name.
    3939     */
    40     static void
    41     denamgle_name (std::string& name, std::string& demangled)
     40    bool
     41    is_cplusplus (const std::string& name)
     42    {
     43      char* demangled_name = ::cplus_demangle (name.c_str (),
     44                                               DMGL_ANSI | DMGL_PARAMS);
     45      bool yes = false;
     46      if (demangled_name)
     47      {
     48        yes = true;
     49        ::free (demangled_name);
     50      }
     51      return yes;
     52    }
     53
     54    void
     55    demangle_name (std::string& name, std::string& demangled)
    4256    {
    4357      char* demangled_name = ::cplus_demangle (name.c_str (),
     
    7185        throw rld_error_at ("object pointer is 0");
    7286      if (is_cplusplus ())
    73         denamgle_name (name_, demangled_);
     87        demangle_name (name_, demangled_);
    7488    }
    7589
     
    8498    {
    8599      if (is_cplusplus ())
    86         denamgle_name (name_, demangled_);
     100        demangle_name (name_, demangled_);
    87101    }
    88102
  • rtemstoolkit/rld-symbols.h

    rc81066f r6c94148  
    4646  {
    4747    /**
     48     * C++ demangler.
     49     */
     50    bool is_cplusplus (const std::string& name);
     51    void demangle_name (std::string& name, std::string& demangled);
     52
     53    /**
    4854     * Use a local type for the address.
    4955     */
Note: See TracChangeset for help on using the changeset viewer.