diff options
author | Roland McGrath <roland@redhat.com> | 2009-07-02 00:57:27 -0700 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2009-07-02 00:57:27 -0700 |
commit | 6f3eb01147ecd46d5519ba4a49d1d085468372dc (patch) | |
tree | 9cfe07a5f4348992a0f082b9787366c7372599fb | |
parent | fdbe23862600c7d1b34906430e0c2586ebd00edb (diff) | |
parent | 0bce6cec0568c7aa36c8e5998cb2fd709f3ee1de (diff) |
Merge roland/dwarf-collector, fiddle constructors more.upstream/roland/dwarf_edit
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | libdw/ChangeLog | 6 | ||||
-rw-r--r-- | libdw/c++/data-values.hh | 4 | ||||
-rw-r--r-- | libdw/c++/dwarf | 4 | ||||
-rw-r--r-- | libdw/c++/dwarf_comparator | 195 | ||||
-rw-r--r-- | libdw/c++/dwarf_data | 313 | ||||
-rw-r--r-- | libdw/c++/dwarf_edit | 48 | ||||
-rw-r--r-- | libdw/c++/dwarf_output | 59 | ||||
-rw-r--r-- | libdw/c++/dwarf_tracker | 395 | ||||
-rw-r--r-- | libdw/c++/subr.hh | 92 | ||||
-rw-r--r-- | po/de.po | 627 | ||||
-rw-r--r-- | src/ChangeLog | 10 | ||||
-rw-r--r-- | src/dwarfcmp.cc | 19 | ||||
-rw-r--r-- | src/readelf.c | 11 | ||||
-rw-r--r-- | tests/ChangeLog | 5 | ||||
-rw-r--r-- | tests/dwarf_edit.cc | 7 | ||||
-rwxr-xr-x | tests/run-dwarfcmp-self.sh | 16 |
17 files changed, 1110 insertions, 703 deletions
@@ -4,6 +4,8 @@ libelf: Add elf_getshdrnum alias for elf_getshnum and elf_getshdrstrndx alias for elf_getshstrndx and deprecate original names. Sun screwed up their implementation and asked for a solution. +readelf: Add -N option, speeds up DWARF printing without address->name lookups. + Version 0.141: libebl: sparc backend fixes; diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 9d185441..28cc39a5 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,9 @@ +2009-07-01 Roland McGrath <roland@redhat.com> + + * c++/dwarf_tracker: Major revamp for efficiency and to handle + circular reference chains. + * c++/dwarf_comparator: Tracker interface changes. + 2009-06-19 Roland McGrath <roland@redhat.com> * c++/dwarf_comparator: New file. diff --git a/libdw/c++/data-values.hh b/libdw/c++/data-values.hh index ec1e5455..55860f5c 100644 --- a/libdw/c++/data-values.hh +++ b/libdw/c++/data-values.hh @@ -54,9 +54,9 @@ namespace elfutils { - template<class impl, typename arg, typename v> + template<class impl, typename v> dwarf::value_space - dwarf_data::attr_value<impl, arg, v>::what_space () const + dwarf_data::attr_value<impl, v>::what_space () const { if (typeid (*_m_value) == typeid (typename v::value_flag)) return dwarf::VS_flag; diff --git a/libdw/c++/dwarf b/libdw/c++/dwarf index a3bee5dd..311591fe 100644 --- a/libdw/c++/dwarf +++ b/libdw/c++/dwarf @@ -796,6 +796,10 @@ namespace elfutils } public: + inline const_iterator () + : _m_stack () + {} + inline const_iterator (const raw_iterator &i) { _m_stack.push (i); diff --git a/libdw/c++/dwarf_comparator b/libdw/c++/dwarf_comparator index 8042a949..55a41717 100644 --- a/libdw/c++/dwarf_comparator +++ b/libdw/c++/dwarf_comparator @@ -57,9 +57,8 @@ namespace elfutils // Prototypical stub for reference tracker object. // This keeps no state, and no two contexts ever match. template<class dwarf1, class dwarf2> - class dwarf_tracker_base + struct dwarf_tracker_base { - protected: typedef typename dwarf1::compile_units::const_iterator cu1; typedef typename dwarf2::compile_units::const_iterator cu2; typedef typename dwarf1::debug_info_entry dwarf1_die; @@ -69,19 +68,27 @@ namespace elfutils typedef typename dwarf1_die::attributes_type::const_iterator attr1; typedef typename dwarf2_die::attributes_type::const_iterator attr2; - public: - inline void start_walk (const cu1 &a, const cu2 &b) - { - } - inline void finish_walk (const cu1 &a, const cu2 &b) - { - } - inline void pre_order (const die1 &a, const die2 &b) + // This object is created to start a walk and destroyed to finish one. + struct walk { - } - inline void post_order (const die1 &a, const die2 &b) + inline walk (dwarf_tracker_base *, const cu1 &a, const cu2 &b) + { + } + inline ~walk () + { + } + }; + + // This object is created in pre-order and destroyed in post-order. + struct step { - } + inline step (dwarf_tracker_base *, const die1 &a, const die2 &b) + { + } + inline ~step () + { + } + }; inline void visit (const typename dwarf1::debug_info_entry &a, const typename dwarf2::debug_info_entry &b) @@ -104,12 +111,15 @@ namespace elfutils } struct left_context_type {}; + struct right_context_type {}; + + // Return the lhs context of an arbitrary DIE. inline const left_context_type left_context (const die1 &die) { return left_context_type (); } - struct right_context_type {}; + // Return the rhs context of an arbitrary DIE. inline const right_context_type right_context (const die2 &die) { return right_context_type (); @@ -127,6 +137,32 @@ namespace elfutils { return false; } + + struct reference_match + { + inline bool cannot_match () const + { + return false; + } + inline void notice_match (const die2 &, bool) const + { + } + }; + + inline bool reference_matched (reference_match &, + const die1 &, const die2 &) + { + return false; + } + + inline dwarf_tracker_base () + {} + + inline dwarf_tracker_base (const dwarf_tracker_base &, reference_match &, + const left_context_type &, const die1 &, + const right_context_type &, const die2 &) + {} + }; template<class dwarf1, class dwarf2, @@ -142,8 +178,8 @@ namespace elfutils template<typename item1, typename item2> struct matcher : public std::binary_function<item1, item2, bool> { - dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &_m_cmp; - matcher (dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &cmp) + dwarf_comparator &_m_cmp; + matcher (dwarf_comparator &cmp) : _m_cmp (cmp) {} @@ -153,7 +189,8 @@ namespace elfutils } }; #define MATCHER(item) \ - matcher<typename dwarf1::item, typename dwarf2::item> + matcher<typename dwarf1::item::const_iterator, \ + typename dwarf2::item::const_iterator> (*this) inline bool match (const dwarf1 &a, const dwarf2 &b) { @@ -171,8 +208,7 @@ namespace elfutils const cu1_it end1 = a.end (); const cu2_it end2 = b.end (); if (subr::container_equal - (it1, end1, it2, end2, - MATCHER (compile_units::const_iterator) (*this))) + (it1, end1, it2, end2, MATCHER (compile_units))) return true; _m_tracker.mismatch (it1, end1, it2, end2); return false; @@ -182,19 +218,8 @@ namespace elfutils typedef typename dwarf2::debug_info_entry die2; inline bool match (const cu1_it &a, const cu2_it &b) { - bool result; - _m_tracker.start_walk (a, b); - try - { - result = match (static_cast<die1> (*a), static_cast<die2> (*b)); - } - catch (...) - { - _m_tracker.finish_walk (a, b); - throw; - } - _m_tracker.finish_walk (a, b); - return result; + typename tracker::walk in (&_m_tracker, a, b); + return match (static_cast<die1> (*a), static_cast<die2> (*b)); } inline bool match (const die1 &a, const die2 &b) @@ -233,8 +258,8 @@ namespace elfutils struct match_rhs : public std::binary_function<ait1, ait2, bool> { - dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &_m_cmp; - match_rhs (dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &cmp) + dwarf_comparator &_m_cmp; + match_rhs (dwarf_comparator &cmp) : _m_cmp (cmp) {} @@ -249,7 +274,7 @@ namespace elfutils typename ait2_map::value_type, bool> { - dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &_m_cmp; + dwarf_comparator &_m_cmp; match_sorted (dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &cmp) : _m_cmp (cmp) @@ -312,38 +337,39 @@ namespace elfutils typedef typename dwarf2::debug_info_entry::children_type children2; typedef typename children1::const_iterator cit1; typedef typename children2::const_iterator cit2; - struct die_matcher - : public std::binary_function<cit1, cit2, bool> + + inline bool match_child (const cit1 &a, const cit2 &b) { - dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &_m_cmp; - die_matcher (dwarf_comparator<dwarf1, dwarf2, ignore_refs, tracker> &cmp) - : _m_cmp (cmp) - {} + typename tracker::step into (&_m_tracker, a, b); + return match (*a, *b); + } + + inline bool match (const cit1 &a, const cit2 &b) + { + // Maybe the tracker has already cached a correspondence of DIEs. + typename tracker::reference_match matched; + if (_m_tracker.reference_matched (matched, a, b)) + return true; + + if (matched.cannot_match ()) + return false; + + bool result = match_child (a, b); + + // Let the tracker cache a result for its reference_matched. + matched.notice_match (b, result); + + return result; + } - inline bool operator () (const cit1 &a, const cit2 &b) - { - bool result; - _m_cmp._m_tracker.pre_order (a, b); - try - { - result = _m_cmp.match (*a, *b); - } - catch (...) - { - _m_cmp._m_tracker.post_order (a, b); - throw; - } - _m_cmp._m_tracker.post_order (a, b); - return result; - } - }; inline bool match (const children1 &a, const children2 &b) { cit1 it1 = a.begin (); cit2 it2 = b.begin (); const cit1 end1 = a.end (); const cit2 end2 = b.end (); - if (subr::container_equal (it1, end1, it2, end2, die_matcher (*this))) + if (subr::container_equal (it1, end1, it2, end2, + MATCHER (debug_info_entry::children_type))) return true; _m_tracker.mismatch (it1, end1, it2, end2); return false; @@ -434,25 +460,58 @@ namespace elfutils return true; // Simplest mismatches with the cheapest checks first. - if (a.tag () != b.tag () - || a.has_children () != b.has_children ()) + if (a.tag () != b.tag ()) + return false; + + const bool has_children = a.has_children (); + if (has_children != b.has_children ()) + return false; + + // Maybe the tracker has already cached a correspondence of references. + typename tracker::reference_match matched; + if (_m_tracker.reference_matched (matched, ref1, ref2)) + return true; + + if (matched.cannot_match ()) return false; - // Now we have to get the tracker involved. + // Now we really have to get the tracker involved. const typename tracker::left_context_type &lhs = _m_tracker.left_context (ref1); const typename tracker::right_context_type &rhs = _m_tracker.right_context (ref2); - // First do the cheap mismatch check on the contexts, then check the - // contents and contexts in ascending order of costliness of a check. - return (!_m_tracker.context_quick_mismatch (lhs, rhs) - && match (a.attributes (), b.attributes ()) - && _m_tracker.context_match (lhs, rhs) - && match (a.children (), b.children ())); + /* First do the cheap mismatch check on the contexts, then check the + contents and contexts in ascending order of costliness of a check. */ + if (_m_tracker.context_quick_mismatch (lhs, rhs) + || !match (a.attributes (), b.attributes ()) + || !_m_tracker.context_match (lhs, rhs)) + return false; + + /* To compare the children, we have to clone the tracker and use a + new one, in case of any reference attributes in their subtrees. + The new tracker jump-starts its walk to the referenced DIE from + the root of the CU. */ + bool result = !has_children || (dwarf_comparator (tracker (_m_tracker, + matched, + lhs, ref1, + rhs, ref2)) + .match (a.children (), b.children ())); + + // Let the tracker cache a result for its reference_matched. + matched.notice_match (ref2, result); + + return result; } + inline explicit dwarf_comparator (const tracker &t) + : _m_tracker (t) + {} + public: + inline dwarf_comparator () + {} + inline bool operator () (const dwarf1 &a, const dwarf2 &b) { return match (a, b); diff --git a/libdw/c++/dwarf_data b/libdw/c++/dwarf_data index 1f92fddf..6d039009 100644 --- a/libdw/c++/dwarf_data +++ b/libdw/c++/dwarf_data @@ -673,7 +673,7 @@ namespace elfutils public: struct nothing {}; - template<typename impl, typename constructor_arg_type> + template<typename impl> struct value { struct value_dispatch @@ -681,9 +681,9 @@ namespace elfutils virtual ~value_dispatch () {} }; - template<typename flavor, typename input> + template<typename flavor, typename input, typename arg_type> static inline value_dispatch * - make (flavor *&result, const input &x, const constructor_arg_type &arg) + make (flavor *&result, const input &x, const arg_type &arg) { return result = new flavor (x, arg); } @@ -692,8 +692,8 @@ namespace elfutils { inline value_string () {} - template<typename string> - inline value_string (const string &s, const constructor_arg_type &arg) + template<typename string, typename arg_type> + inline value_string (const string &s, const arg_type &arg) : std::string (s) {} @@ -708,8 +708,8 @@ namespace elfutils struct value_identifier : public value_string { - template<typename id> - inline value_identifier (const id &s, const constructor_arg_type &arg) + template<typename id, typename arg_type> + inline value_identifier (const id &s, const arg_type &arg) : value_string (s, arg) {} }; @@ -717,29 +717,32 @@ namespace elfutils struct value_reference : public value_dispatch { typename impl::debug_info_entry::children_type::iterator ref; + + template<typename arg_type> inline value_reference (const typename impl::debug_info_entry::children_type::iterator &i, - const constructor_arg_type &arg) + const arg_type &arg) : ref (i) {} - template<typename iter> // XXX dummy - value_reference (const iter &i, const constructor_arg_type &arg) + template<typename iter, typename arg_type> // XXX dummy + inline value_reference (const iter &i, const arg_type &arg) : ref () {} }; struct value_unit_reference : public value_dispatch { typename impl::compile_units::iterator ref; + + template<typename arg_type> inline value_unit_reference (const typename impl::compile_units::iterator &i, - const constructor_arg_type &arg) + const arg_type &arg) : ref (i) {} - template<typename iter> // XXX dummy - value_unit_reference (const iter &i, - const constructor_arg_type &arg) + template<typename iter, typename arg_type> // XXX dummy + inline value_unit_reference (const iter &i, const arg_type &arg) : ref () {} }; @@ -752,7 +755,8 @@ namespace elfutils : flag (true) {} - inline value_flag (bool t, const constructor_arg_type &arg) + template<typename arg_type> + inline value_flag (bool t, const arg_type &arg) : flag (t) {} }; @@ -766,31 +770,28 @@ namespace elfutils : addr (0) {} - inline value_address (::Dwarf_Addr a, const constructor_arg_type &arg) - : addr (a) + template<typename arg_type> + inline value_address (::Dwarf_Addr x, const arg_type &arg) + : addr (x) {} }; struct value_rangelistptr : public value_dispatch, public range_list { - inline value_rangelistptr () - {} + inline value_rangelistptr () {} - template<typename list> - inline value_rangelistptr (const list &other, - const constructor_arg_type &arg) + template<typename list, typename arg_type> + inline value_rangelistptr (const list &other, const arg_type &arg) : range_list (other) {} }; struct value_lineptr : public value_dispatch, public impl::line_info_table { - inline value_lineptr () - {} + inline value_lineptr () {} - template<typename table> - inline value_lineptr (const table &other, - const constructor_arg_type &arg) + template<typename table, typename arg_type> + inline value_lineptr (const table &other, const arg_type &arg) : impl::line_info_table (other) {} }; @@ -807,7 +808,8 @@ namespace elfutils : word (0) {} - inline value_constant (::Dwarf_Word x, const constructor_arg_type &arg) + template<typename arg_type> + inline value_constant (::Dwarf_Word x, const arg_type &arg) : word (x) {} }; @@ -817,9 +819,8 @@ namespace elfutils { inline value_constant_block () {} - template<typename block> - inline value_constant_block (const block &b, - const constructor_arg_type &arg) + template<typename block, typename arg_type> + inline value_constant_block (const block &b, const arg_type &arg) : std::vector<uint8_t> (b.begin (), b.end ()) {} }; @@ -828,21 +829,20 @@ namespace elfutils { inline value_dwarf_constant () {} - template<typename constant> - inline value_dwarf_constant (const constant &other, - const constructor_arg_type &arg) - : dwarf_enum (other) {} + template<typename constant, typename arg_type> + inline value_dwarf_constant (const constant &other, const arg_type &arg) + : dwarf_enum (other) + {} }; struct value_source_file : public value_dispatch, public source_file { - inline value_source_file () - {} + inline value_source_file () {} - template<typename file> - inline value_source_file (const file &other, - const constructor_arg_type &arg) - : source_file (other) {} + template<typename file, typename arg_type> + inline value_source_file (const file &other, const arg_type &arg) + : source_file (other) + {} }; struct value_source_line : public value_dispatch @@ -853,8 +853,8 @@ namespace elfutils : n (0) {} - inline value_source_line (unsigned int m, - const constructor_arg_type &arg) + template<typename arg_type> + inline value_source_line (unsigned int m, const arg_type &arg) : n (m) {} }; @@ -864,75 +864,72 @@ namespace elfutils struct value_location : public value_dispatch, public location_attr { - inline value_location () - {} + inline value_location () {} - template<typename loc> - inline value_location (const loc &other, - const constructor_arg_type &arg) + template<typename loc, typename arg_type> + inline value_location (const loc &other, const arg_type &arg) : location_attr (other) {} }; }; - template<class impl, - typename constructor_arg_type = nothing, - typename vw = value<impl, constructor_arg_type> - > + template<class impl, typename vw = value<impl> > class attr_value { private: typename vw::value_dispatch *_m_value; - template<typename value> - inline void init (const value &other, - const constructor_arg_type &arg - = constructor_arg_type ()) + template<typename value, typename arg_type = nothing> + struct init { - switch (other.what_space ()) - { -#define _DWARF_DATA_AV_MAKE(flavor, fetch) \ - case dwarf::VS_##flavor: \ - { \ - typename vw::value_##flavor *p; \ - _m_value = vw::make (p, other.fetch (), arg); \ - } \ - break - - _DWARF_DATA_AV_MAKE (identifier, identifier); - _DWARF_DATA_AV_MAKE (string, string); - _DWARF_DATA_AV_MAKE (flag, flag); - _DWARF_DATA_AV_MAKE (rangelistptr, ranges); - _DWARF_DATA_AV_MAKE (lineptr, line_info); - _DWARF_DATA_AV_MAKE (address, address); - _DWARF_DATA_AV_MAKE (source_line, source_line); - _DWARF_DATA_AV_MAKE (source_file, source_file); - _DWARF_DATA_AV_MAKE (dwarf_constant, dwarf_constant); - _DWARF_DATA_AV_MAKE (reference, reference); - _DWARF_DATA_AV_MAKE (unit_reference, unit_reference); - _DWARF_DATA_AV_MAKE (location, location); - //_DWARF_DATA_AV_MAKE (macptr, macros); XXX - - case dwarf::VS_constant: - if (other.constant_is_integer ()) - { - typename vw::value_constant *p; - _m_value = vw::make (p, other.constant (), arg); - } - else - { - typename vw::value_constant_block *p; - _m_value = vw::make (p, other.constant_block (), arg); - } - break; - - default: - case dwarf::VS_discr_list: - throw std::runtime_error ("XXX unimplemented"); + inline init (attr_value *av, + const value &other, const arg_type &arg = arg_type ()) + { + switch (other.what_space ()) + { +#define _DWARF_DATA_AV_MAKE(flavor, fetch) \ + case dwarf::VS_##flavor: \ + { \ + typename vw::value_##flavor *p; \ + av->_m_value = vw::make (p, other.fetch (), arg); \ + } \ + break + + _DWARF_DATA_AV_MAKE (identifier, identifier); + _DWARF_DATA_AV_MAKE (string, string); + _DWARF_DATA_AV_MAKE (flag, flag); + _DWARF_DATA_AV_MAKE (rangelistptr, ranges); + _DWARF_DATA_AV_MAKE (lineptr, line_info); + _DWARF_DATA_AV_MAKE (address, address); + _DWARF_DATA_AV_MAKE (source_line, source_line); + _DWARF_DATA_AV_MAKE (source_file, source_file); + _DWARF_DATA_AV_MAKE (dwarf_constant, dwarf_constant); + _DWARF_DATA_AV_MAKE (reference, reference); + _DWARF_DATA_AV_MAKE (unit_reference, unit_reference); + _DWARF_DATA_AV_MAKE (location, location); + //_DWARF_DATA_AV_MAKE (macptr, macros); XXX + + case dwarf::VS_constant: + if (other.constant_is_integer ()) + { + typename vw::value_constant *p; + av->_m_value = vw::make (p, other.constant (), arg); + } + else + { + typename vw::value_constant_block *p; + av->_m_value = vw::make (p, other.constant_block (), arg); + } + break; + + default: + case dwarf::VS_discr_list: + throw std::runtime_error ("XXX unimplemented"); #undef _DWARF_DATA_AV_MAKE - } - } + } + } + }; template<typename flavor> inline flavor &const_variant () const @@ -962,14 +959,14 @@ namespace elfutils : _m_value (NULL) { if (other._m_value != NULL) - init (other); + init<attr_value> me (this, other); } - template<typename value> - attr_value (const value &other, const constructor_arg_type &arg) + template<typename value, typename arg_type> + attr_value (const value &other, const arg_type &arg) : _m_value (NULL) { - init (other, arg); + init<value, arg_type> me (this, other, arg); } inline attr_value () @@ -989,7 +986,7 @@ namespace elfutils delete _m_value; _m_value = NULL; } - init (other); + init<attr_value> me (this, other); return *this; } template<typename value> @@ -1000,7 +997,7 @@ namespace elfutils delete _m_value; _m_value = NULL; } - init (other); + init<value> me (this, other); return *this; } @@ -1215,110 +1212,24 @@ namespace elfutils } }; - template<class dwarf_output, typename constructor_arg_type = nothing> - struct constructor_arg_adapter - { - template<typename input, typename output> - struct make_any - : public std::binary_function<typename input::value_type, - constructor_arg_type, - typename output::value_type> - { - inline typename output::value_type - operator () (const typename input::value_type &x, - const constructor_arg_type &c) const - { - return typename output::value_type (x, c); - } - }; - - template<typename input, typename output> - struct make_attribute - : public std::binary_function<typename input::value_type, - constructor_arg_type, - typename output::value_type> - { - inline typename output::value_type - operator () (const typename input::value_type &x, - const constructor_arg_type &c) const - { - return std::make_pair - (x.first, typename output::value_type::second_type (x.second, c)); - } - }; - - /* An iterator adapter for use in iterator-based constructors. - collectify (iterator) yields an iterator on input where *i - constructs output::value_type (input::value_type v, collector). */ - template<typename input, typename output, - typename make_outlet = make_any<input, output> > - struct argify - : public std::unary_function<typename input::const_iterator, - typename output::iterator> - { - typedef typename input::const_iterator inny; - typedef typename output::iterator outty; - typedef typename input::value_type inlet; - typedef typename output::value_type outlet; - - /* Wrapper worker passed to wrapped_input_iterator. - This object holds the collector pointer. */ - struct maker - : public std::unary_function<inlet, outlet> - { - constructor_arg_type _m_arg; - explicit inline maker (const constructor_arg_type &c) : _m_arg (c) {} - - inline outlet operator () (const inlet &x) const - { - return make_outlet () (x, _m_arg); - } - } _m_maker; - - explicit inline argify (const constructor_arg_type &c) - : _m_maker (c) - {} - - typedef subr::wrapped_input_iterator<input, maker> wrapped; - - inline wrapped operator () (const inny &i) - { - return wrapped (i, _m_maker); - } - }; - - template<class input> - static inline argify< - input, typename dwarf_output::debug_info_entry::attributes_type, - make_attribute<input, - typename dwarf_output::debug_info_entry::attributes_type> - > attr (const input &, const constructor_arg_type &c) - { - return argify< - input, typename dwarf_output::debug_info_entry::attributes_type, - make_attribute< - input, typename dwarf_output::debug_info_entry::attributes_type> - > (c); - }; - }; - - template<class impl, typename arg = nothing, typename v = value<impl, arg> > + template<class impl, typename arg = nothing, typename v = value<impl> > class attributes_type - : public std::map<int, attr_value<impl, arg, v> > + : public std::map<int, attr_value<impl, v> > { friend class impl::debug_info_entry; private: - typedef std::map<int, attr_value<impl, arg, v> > base_type; - typedef constructor_arg_adapter<impl, arg> argify; + typedef std::map<int, attr_value<impl, v> > base_type; protected: inline attributes_type () {} public: // XXX should be protected - template<typename input> - inline attributes_type (const input &other, const arg &c) - : base_type (argify::attr (other, c) (other.begin ()), - argify::attr (other, c) (other.end ())) + template<typename input, typename arg_type> + inline attributes_type (const input &other, const arg_type &c) + : base_type (subr::argify2nd<input, attributes_type, arg_type> + (other.begin (), c), + subr::argify2nd<input, attributes_type, arg_type> + (other.end (), c)) {} public: @@ -1345,8 +1256,8 @@ namespace elfutils return elfutils::to_string (*this); // Use that. } - template<class impl, typename arg, typename v> - inline std::string dwarf_data::attr_value<impl, arg, v>::to_string () const + template<class impl, typename v> + inline std::string dwarf_data::attr_value<impl, v>::to_string () const { return elfutils::to_string (*this); // Use that. } diff --git a/libdw/c++/dwarf_edit b/libdw/c++/dwarf_edit index d936f1c8..8e12c5da 100644 --- a/libdw/c++/dwarf_edit +++ b/libdw/c++/dwarf_edit @@ -52,6 +52,7 @@ #include "dwarf" #include "dwarf_data" +#include "dwarf_tracker" /* Read the comments for elfutils::dwarf first. @@ -109,9 +110,12 @@ namespace elfutils private: children_type () {} - template<typename childrens> - children_type (const childrens &other) - : std::list<debug_info_entry> (other.begin (), other.end ()) {} + template<typename input, typename tracker> + children_type (const input &other, tracker *t) + : std::list<debug_info_entry> + (subr::argify<input, children_type, tracker *> (other.begin (), t), + subr::argify<input, children_type, tracker *> (other.end (), t)) + {} public: typedef debug_info_entry value_type; @@ -132,9 +136,9 @@ namespace elfutils inline attributes_type () {} - template<typename attrs> - inline attributes_type (const attrs &other) - : base_type (other, dwarf_data::nothing ()) + template<typename attrs, typename tracker> + inline attributes_type (const attrs &other, tracker *t) + : base_type (other, t) {} }; @@ -152,11 +156,11 @@ namespace elfutils /* The template constructor lets us copy in from any class that has compatibly iterable containers for attributes and children. */ - template<typename die_type> - debug_info_entry (const die_type &die) + template<typename die_type, typename tracker> + debug_info_entry (const die_type &die, tracker *t) : _m_tag (die.tag ()), - _m_attributes (die.attributes ()), - _m_children (die.children ()) + _m_attributes (die.attributes (), t), + _m_children (die.children (), t) {} inline int tag () const @@ -227,8 +231,9 @@ namespace elfutils // XXX should be private public: - template<typename die_type> - compile_unit (const die_type &die) : debug_info_entry (die) + template<typename die_type, typename tracker> + inline compile_unit (const die_type &die, tracker *t) + : debug_info_entry (die, t) { if (die.tag () != ::DW_TAG_compile_unit) throw std::invalid_argument ("not a compile_unit entry"); @@ -248,12 +253,17 @@ namespace elfutils typedef std::list<compile_unit> _base; // Default constructor: an empty container, no CUs. - inline compile_units () {} + inline compile_units () + {} // Constructor copying CUs from input container. - template<typename input> - compile_units(const input &units) - : _base (units.begin (), units.end ()) {} + template<typename input, typename tracker> + inline compile_units (const input &units, tracker *t) + : _base (subr::argify<input, compile_units, tracker *> + (units.begin (), t), + subr::argify<input, compile_units, tracker *> + (units.end (), t)) + {} public: typedef compile_unit value_type; @@ -302,8 +312,10 @@ namespace elfutils inline dwarf_edit () {} // Constructor copying CUs from an input file (dwarf or dwarf_edit). - template<typename input> - dwarf_edit (const input &dw) : _m_units (dw.compile_units ()) {} + template<typename input, typename tracker> + dwarf_edit (const input &dw, tracker *t) + : _m_units (dw.compile_units (), t) + {} template<typename file> inline bool operator== (const file &other) const diff --git a/libdw/c++/dwarf_output b/libdw/c++/dwarf_output index 65bff72f..ff2621ba 100644 --- a/libdw/c++/dwarf_output +++ b/libdw/c++/dwarf_output @@ -291,19 +291,20 @@ namespace elfutils static inline const std::string & collect_string (dwarf_output_collector *, const input &); - template<typename input> - static inline const range_list & - collect (dwarf_output_collector *, const typename input::range_list &); - /* An iterator adapter for use in iterator-based constructors. collectify (iterator) yields an iterator on input where *i constructs output::value_type (input::value_type v, collector). */ - typedef dwarf_data::constructor_arg_adapter<dwarf_output, - dwarf_output_collector *> - collectify; + template<typename input, typename output> + static inline typename subr::argifier<input, output, + dwarf_output_collector *>::wrapped + collectify (const typename input::const_iterator &in, + dwarf_output_collector *c) + { + return subr::argifier<input, output, dwarf_output_collector *> (c) (in); + } struct value_wrapper - : public dwarf_data::value<dwarf_output, dwarf_output_collector *> + : public dwarf_data::value<dwarf_output> { struct value_string : public value_dispatch { @@ -327,13 +328,33 @@ namespace elfutils return result; } }; + + template<typename flavor, typename input> + static inline value_dispatch * + make (flavor *&result, const input &x, const dwarf_data::nothing &) + { + throw std::logic_error ("dwarf_output cannot be default-constructed"); + } + + template<typename flavor, typename input, typename arg_type> + static inline value_dispatch * + make (flavor *&result, const input &x, const arg_type &arg) + { + return result = new flavor (x, arg); + } + + template<typename input> + static inline value_dispatch * + make (value_string *&result, const input &x, dwarf_output_collector *c) + { + return result = new value_string (x, c); + } + }; public: - typedef dwarf_data::attr_value<dwarf_output, - dwarf_output_collector *, - value_wrapper> attr_value; + typedef dwarf_data::attr_value<dwarf_output, value_wrapper> attr_value; class compile_units; @@ -350,8 +371,8 @@ namespace elfutils template<typename input> inline children_type (const input &other, dwarf_output_collector *c) : std::list<debug_info_entry> - (collectify::argify<input, children_type> (c) (other.begin ()), - collectify::argify<input, children_type> (c) (other.end ())) + (collectify<input, children_type> (other.begin (), c), + collectify<input, children_type> (other.end (), c)) {} public: @@ -478,8 +499,8 @@ namespace elfutils // Constructor copying CUs from input container. template<typename input> compile_units (const input &units, dwarf_output_collector *c) - : _base (collectify::argify<input, compile_units> (c) (units.begin ()), - collectify::argify<input, compile_units> (c) (units.end ())) + : _base (collectify<input, compile_units> (units.begin (), c), + collectify<input, compile_units> (units.end (), c)) { } @@ -563,14 +584,6 @@ namespace elfutils return c->_m_strings.add (s); } - template<typename input> - inline const dwarf_output::range_list & - dwarf_output::collect (dwarf_output_collector *c, - const typename input::range_list &rl) - { - return c->_m_ranges.add (rl); - } - }; #endif // <elfutils/dwarf_output> diff --git a/libdw/c++/dwarf_tracker b/libdw/c++/dwarf_tracker index 8382d2e1..c27a737f 100644 --- a/libdw/c++/dwarf_tracker +++ b/libdw/c++/dwarf_tracker @@ -52,6 +52,8 @@ #include "dwarf" #include "dwarf_comparator" +#include <tr1/unordered_map> +#include <tr1/unordered_set> namespace elfutils { @@ -62,95 +64,262 @@ namespace elfutils private: typedef dwarf_tracker_base<dwarf1, dwarf2> _base; + public: typedef typename _base::cu1 cu1; typedef typename _base::cu2 cu2; typedef typename _base::die1 die1; typedef typename _base::die2 die2; - /* We maintain the current path down the logical DIE tree from the CU - as a stack of iterators pointing to the DIE at each level. */ + private: template<typename cu, typename die> struct tracker { - cu _m_root; - + /* We maintain the current path down the logical DIE tree from the CU + as a stack of iterators pointing to the DIE at each level. */ typedef std::list<die> die_path; - die_path _m_path; + + // We use a singleton list of a default-constructed iterator as a marker. + static inline const die_path bad_die_path () + { + return die_path (1); + } + static inline bool bad_die_path (const die_path &path) + { + typename die_path::const_iterator it = path.begin (); + if (it == path.end ()) + return false; + const die &elt = *it; + return ++it == path.end () && elt == die (); + } /* We record every DIE we have seen here, mapping its .identity () to the die_path of parent DIEs taken to reach it. */ typedef std::tr1::unordered_map< ::Dwarf_Off, const die_path> die_map; - die_map _m_seen; + die_map *_m_seen; + bool _m_delete_seen; + + cu _m_root; + + die_path _m_path; + + // Default constructor: an original tracker. + inline tracker () + : _m_seen (new die_map), _m_delete_seen (true) + {} - ~tracker () + // Construct a derived tracker: does its own walk, but sharing caches. + inline tracker (const tracker &proto, + const die_path &context, const die &there) + : _m_seen (proto._m_seen), _m_delete_seen (false), + _m_root (proto._m_root), _m_path (context) { - // We should never be left with a partial walk on the books. - assert (_m_path.empty ()); + _m_path.push_back (there); } - inline const die_path &path_to (const die &a) + inline ~tracker () { - typename die_map::iterator it = _m_seen.find (a->identity ()); - if (it == _m_seen.end ()) + if (_m_delete_seen) { - ::Dwarf_Off id = a->identity (); - die_path path; - if (!walk_to (*_m_root, id, path)) - throw std::runtime_error ("DIE not reachable from CU!"); - it = _m_seen.insert (std::make_pair (id, path)).first; + delete _m_seen; + // We should never be left with a partial walk on the books. + assert (_m_path.empty ()); } - return it->second; } - // Return true if this is the droid we're looking for, - // or recurse on its children. - bool walk_to (const typename die::value_type from, ::Dwarf_Off to, - die_path &path) - { - if (from.identity () == to) - return true; - for (die it = from.children ().begin (); - it != from.children ().end (); - ++it) - if (walk_to (it, to, path)) - return true; - return false; + // Main hooks for a normal walk. + + /* A walk object does set-up work when constructed and tear-down + work when destroyed, so tear-down is done even for exceptions. */ + struct walk + { + tracker *_m_tracker; + inline walk (tracker *w, const cu &root) + : _m_tracker (w) + { + assert (_m_tracker->_m_path.empty ()); + _m_tracker->_m_root = root; + } + inline ~walk () + { + assert (_m_tracker->_m_path.empty ()); + _m_tracker->_m_root = cu (); + } + }; + + /* A step object does pre-order work when constructed and post-order + work when destroyed, so post-order is done even for exceptions. + While this object lives, HERE is on the _m_path stack. */ + struct step + { + tracker *_m_walker; + inline step (tracker *w, const die &here) + : _m_walker (w) + { + // Record the path down from the CU to see this DIE. + _m_walker->_m_seen->insert (std::make_pair (here->identity (), + _m_walker->_m_path)); + + // Append this DIE to the path we'll record for its children. + _m_walker->_m_path.push_back (here); + } + inline ~step () + { + _m_walker->_m_path.pop_back (); + } + }; + + // Random access to a DIE, find the path of the walk that gets there. + inline const die_path &path_to (const die &a) + { + ::Dwarf_Off id = a->identity (); + std::pair<typename die_map::iterator, bool> found + = _m_seen->insert (std::make_pair (id, bad_die_path ())); + if (found.second + /* It's not in our _m_seen map. Our main walk recording + into _m_seen is exhaustive, so this can only be a forward + reference. That is, we didn't already hit this DIE in + our top-level walk and so it is not in _m_seen yet. + + We must do a separate walk to find it. Since we know + this is a forward reference, we don't have to start a + fresh walk from the root, just momentarily wind forward + from where we are. */ + && !walk_down_to (a, found.first) + && !walk_over_to (a, found.first) + && !walk_up_to (a, found.first)) + throw std::runtime_error ("DIE not reachable from CU!"); + assert (&found.first->second != NULL); + assert (!bad_die_path (found.first->second)); + return found.first->second; + } + + inline bool walk_to (const typename die::value_type &here, + const die &there, typename die_map::iterator &cache) + { + return walk_to (here.children ().begin (), + here.children ().end (), + there, cache); } - // Recursing on a child, include FROM in the path if the child matches. - bool walk_to (const die from, ::Dwarf_Off to, die_path &path) + bool walk_to (die it, const die &end, + const die &there, typename die_map::iterator &cache) { - if (walk_to (*from, to, path)) + for (; it != end; ++it) { - path.push_front (from); - return true; + if (it == there) + { + /* We can't keep the old CACHE iterator and avoid this + find (hash lookup), because there could have been + other insertions in the map since it was taken. + Those can invalidate old iterators. */ + cache = _m_seen->find (there->identity ()); + _m_seen->erase (cache); + cache = _m_seen->insert (cache, + std::make_pair (there->identity (), + _m_path)); + return true; + } + else + { + /* Do "step into" even for !has_children () + because it records this child in _m_seen, + which we will rely on later. */ + step into (this, it); + const typename die::value_type &child = *it; + if (child.has_children () && walk_to (child, there, cache)) + return true; + } } return false; } - inline void start_walk (const cu &a) + /* First descend into the current DIE's children. + _m_path already has the current DIE, so it is ready to go. */ + // XXX is a reference to an owned DIE really possible?? + inline bool walk_down_to (const die &there, + typename die_map::iterator &cache) { - assert (_m_path.empty ()); - _m_root = a; - } + const die &start = _m_path.back (); + const typename die::value_type &here = *start; - inline void finish_walk (const cu &a) - { - assert (_m_path.empty ()); - _m_root = cu (); + /* It's common to have a reference to the next sibling DIE. + So bypass the descent to HERE's children if THERE is + HERE's immediate next sibling. */ + if (!here.has_children () || there == ++die (start)) + return false; + + return walk_to (here, there, cache); } - inline void pre_order (const die &a) + /* A step_back object pops the current DIE off _m_path when + constructed, and pushes it back when destroyed. */ + struct step_back + { + tracker *_m_walker; + const die _m_here; + inline step_back (tracker *w, die ©) + : _m_walker (w), _m_here (w->_m_path.back ()) + { + w->_m_path.pop_back (); + copy = _m_here; + } + inline ~step_back () + { + _m_walker->_m_path.push_back (_m_here); + } + }; + + /* Now wind the walk forward starting from the current DIE's + immediate sibling. */ + inline bool walk_over_to (const die &there, + typename die_map::iterator &cache) { - // Record the path down from the CU to see this DIE. - _m_seen.insert (std::make_pair (a->identity (), _m_path)); - // Append this DIE to the path we'll record for its children. - _m_path.push_back (a); + die next; + step_back from (this, next); + ++next; + + return walk_to (next, (_m_path.empty () + ? (*_m_root).children ().end () + : _m_path.back ()->children ().end ()), + there, cache); } - inline void post_order (const die &a) + /* A step_up object saves _m_path when constructed + and restores it when destroyed. */ + struct step_up { - _m_path.pop_back (); + tracker *_m_walker; + die_path _m_save; + inline step_up (tracker *w) + : _m_walker (w), _m_save (w->_m_path) + { + } + inline ~step_up () + { + _m_walker->_m_path.swap (_m_save); + } + }; + + /* Now wind the walk forward starting from the current DIE's + parent's immediate sibling. */ + inline bool walk_up_to (const die &there, + typename die_map::iterator &cache) + { + if (_m_path.empty ()) + return false; + + step_up from (this); + + do + { + _m_path.pop_back (); + assert (!_m_path.empty ()); + if (walk_over_to (there, cache)) + return true; + } + while (!_m_path.empty ()); + + return false; } }; @@ -160,6 +329,13 @@ namespace elfutils tracker1 _m_left; tracker2 _m_right; + typedef std::tr1::unordered_map< + ::Dwarf_Off, std::pair<const die2 *, + std::tr1::unordered_set< ::Dwarf_Off> > + > equiv_map; + equiv_map *_m_equiv; + bool _m_delete_equiv; + /* Predicate for DIEs "equal enough" to match as context for a subtree. The definition we use is that the DIE has the same tag and all its attributes are equal, excepting that references in attribute values @@ -175,37 +351,44 @@ namespace elfutils }; public: - inline void start_walk (const cu1 &a, const cu2 &b) - { - _m_left.start_walk (a); - _m_right.start_walk (b); - } + inline dwarf_ref_tracker () + : _m_equiv (new equiv_map), _m_delete_equiv (true) + {} - inline void finish_walk (const cu1 &a, const cu2 &b) + inline void reset () { - _m_left.finish_walk (a); - _m_right.finish_walk (b); + _m_equiv->clear (); + assert (!_m_right->_m_delete_seen); + _m_right._m_seen->clear (); } - inline void pre_order (const die1 &a, const die2 &b) + struct walk { - _m_left.pre_order (a); - _m_right.pre_order (b); - } + typename tracker1::walk _m_left; + typename tracker2::walk _m_right; + + inline walk (dwarf_ref_tracker *w, const cu1 &a, const cu2 &b) + : _m_left (&w->_m_left, a), _m_right (&w->_m_right, b) + {} + }; - inline void post_order (const die1 &a, const die2 &b) + struct step { - _m_left.post_order (a); - _m_right.post_order (b); - } + typename tracker1::step _m_left; + typename tracker2::step _m_right; + + inline step (dwarf_ref_tracker *w, const die1 &a, const die2 &b) + : _m_left (&w->_m_left, a), _m_right (&w->_m_right, b) + {} + }; - typedef std::list<die1> left_context_type; + typedef typename tracker1::die_path left_context_type; inline const left_context_type &left_context (const die1 &die) { return _m_left.path_to (die); } - typedef std::list<die2> right_context_type; + typedef typename tracker2::die_path right_context_type; inline const right_context_type &right_context (const die2 &die) { return _m_right.path_to (die); @@ -225,6 +408,80 @@ namespace elfutils { return std::equal (a.begin (), a.end (), b.begin (), equal_enough ()); } + + class reference_match + { + friend class dwarf_ref_tracker; + private: + typename equiv_map::mapped_type *_m_elt; + + public: + + inline reference_match () + : _m_elt (NULL) + {} + + inline ~reference_match () + { + if (_m_elt != NULL) + _m_elt->first = NULL; + } + + inline bool cannot_match () const + { + return _m_elt == NULL; + } + + inline void notice_match (const die2 &b, bool matches) const + { + if (matches && _m_elt != NULL) + _m_elt->second.insert (b->identity ()); + } + }; + + inline bool + reference_matched (reference_match &matched, const die1 &a, const die2 &b) + { + typename equiv_map::mapped_type *elt = &(*_m_equiv)[a->identity ()]; + if (elt->first == NULL) + { + /* Record that we have a walk in progress crossing A. + When MATCHED goes out of scope in our caller, its + destructor will reset ELT->first to clear this record. */ + elt->first = &b; + matched._m_elt = elt; + + // Short-circuit if we have already matched B to A. + return elt->second.find (b->identity ()) != elt->second.end (); + } + + /* We have a circularity. We can tell because ELT->first remains + set from an outer recursion still in progress. + + The circular chain of references rooted at A matches B if B is + also the root of its own circularity and everything along those + parallel chains matches. If the chains hadn't matched so far, + we would not have kept following them to get here. + + We recorded the B that arrived at the first comparison with A. + We actually record the pointer on the caller's stack rather + than a copy of B, just because the iterator might be larger. */ + + return *elt->first == b; + } + + // Share the _m_seen maps with the prototype tracker, + // but start a fresh walk from the given starting point. + inline dwarf_ref_tracker (const dwarf_ref_tracker &proto, + reference_match &matched, + const left_context_type &lhs, const die1 &a, + const right_context_type &rhs, const die2 &b) + : _m_left (tracker1 (proto._m_left, lhs, a)), + _m_right (tracker2 (proto._m_right, rhs, b)), + _m_equiv (proto._m_equiv), _m_delete_equiv (false) + { + // We are starting a recursive consideration of a vs b. + } }; }; diff --git a/libdw/c++/subr.hh b/libdw/c++/subr.hh index 4a90e50c..7a799eeb 100644 --- a/libdw/c++/subr.hh +++ b/libdw/c++/subr.hh @@ -603,6 +603,98 @@ namespace elfutils return (*_m_wrapper) (_base::operator* ()); } }; + + /* An iterator adapter for use in iterator-based constructors. + collectify (iterator) yields an iterator on input where *i + constructs output::value_type (input::value_type v, collector). */ + template<typename input, typename output, typename arg_type> + struct argifier + : public std::unary_function<typename input::const_iterator, + typename output::iterator> + { + typedef typename input::const_iterator inny; + typedef typename output::iterator outty; + typedef typename input::value_type inlet; + typedef typename output::value_type outlet; + + /* Wrapper worker passed to wrapped_input_iterator. + This object holds the collector pointer. */ + struct maker + : public std::unary_function<inlet, outlet> + { + arg_type _m_arg; + explicit inline maker (const arg_type &c) : _m_arg (c) {} + + inline outlet operator () (const inlet &x) const + { + return outlet (x, _m_arg); + } + } _m_maker; + + explicit inline argifier (const arg_type &c) + : _m_maker (c) + {} + + typedef subr::wrapped_input_iterator<input, maker> wrapped; + + inline wrapped operator () (const inny &i) + { + return wrapped (i, _m_maker); + } + }; + + template<typename input, typename output, typename arg_type> + static inline typename argifier<input, output, arg_type>::wrapped + argify (const typename input::const_iterator &in, const arg_type &arg) + { + return argifier<input, output, arg_type> (arg) (in); + } + + template<typename input, typename output, typename arg_type> + struct argifier2nd + : public std::unary_function<typename input::const_iterator, + typename output::iterator> + { + typedef typename input::const_iterator inny; + typedef typename output::iterator outty; + typedef typename input::value_type inlet; + typedef typename output::value_type outlet; + + /* Wrapper worker passed to wrapped_input_iterator. + This object holds the collector pointer. */ + struct maker + : public std::unary_function<inlet, outlet> + { + arg_type _m_arg; + explicit inline maker (const arg_type &c) : _m_arg (c) {} + + inline outlet operator () (const inlet &x) const + { + return std::make_pair (x.first, + typename outlet::second_type (x.second, + _m_arg)); + } + } _m_maker; + + explicit inline argifier2nd (const arg_type &c) + : _m_maker (c) + {} + + typedef subr::wrapped_input_iterator<input, maker> wrapped; + + inline wrapped operator () (const inny &i) + { + return wrapped (i, _m_maker); + } + }; + + template<typename input, typename output, typename arg_type> + static inline typename argifier2nd<input, output, arg_type>::wrapped + argify2nd (const typename input::const_iterator &in, const arg_type &arg) + { + return argifier2nd<input, output, arg_type> (arg) (in); + } + }; }; @@ -6,14 +6,14 @@ # # Thomas Spura <tomspur@fedoraproject.org>, 2009. # Cornelius Neckenig <tbull@fedoraproject.org>, 2009. -# Michael Münch <micm@fsfe.org>, 2009. +# Michael Münch <micm@fedoraproject.org>, 2009. msgid "" msgstr "" "Project-Id-Version: elfutils VERSION\n" "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n" -"POT-Creation-Date: 2009-06-19 02:18+0000\n" -"PO-Revision-Date: 2009-06-19 10:59+0200\n" -"Last-Translator: Michael Münch <micm@fsfe.org>\n" +"POT-Creation-Date: 2009-06-29 08:35+0000\n" +"PO-Revision-Date: 2009-06-29 15:15+0200\n" +"Last-Translator: Michael Münch <micm@fedoraproject.org>\n" "Language-Team: German\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgstr "" "X-Generator: Lokalize 0.3\n" #: ../lib/xmalloc.c:51 ../lib/xmalloc.c:65 ../lib/xmalloc.c:79 -#: ../src/readelf.c:2788 ../src/readelf.c:3126 ../src/unstrip.c:2086 +#: ../src/readelf.c:2796 ../src/readelf.c:3135 ../src/unstrip.c:2086 #: ../src/unstrip.c:2294 #, c-format msgid "memory exhausted" @@ -56,7 +56,7 @@ msgstr "ungültige Grösse des Quell-Operanden" msgid "invalid size of destination operand" msgstr "ungültige Grösse des Ziel-Operanden" -#: ../libelf/elf_error.c:108 ../src/readelf.c:4677 +#: ../libelf/elf_error.c:108 ../src/readelf.c:4686 #, c-format msgid "invalid encoding" msgstr "ungültige Kodierung" @@ -152,7 +152,7 @@ msgstr "data/scn Unterschied" msgid "invalid section header" msgstr "ungültiger Abschnitts-Header" -#: ../libelf/elf_error.c:208 ../src/readelf.c:6147 ../src/readelf.c:6248 +#: ../libelf/elf_error.c:208 ../src/readelf.c:6156 ../src/readelf.c:6257 #, c-format msgid "invalid data" msgstr "Ungültige Daten" @@ -209,7 +209,7 @@ msgstr "ungültiger Parameter" #: ../libasm/asm_error.c:66 msgid "cannot change mode of output file" -msgstr "" +msgstr "konnte Modus der Ausgabedatei nicht ändern" #. Something went wrong. #: ../libasm/asm_error.c:67 ../src/ldgeneric.c:7001 @@ -578,7 +578,7 @@ msgstr "'%' ist nur mit der Option 'x' von Bedeutung" msgid "archive name required" msgstr "Archivname erforderlich" -#: ../src/ar.c:289 ../src/nm.c:253 ../src/readelf.c:434 ../src/size.c:219 +#: ../src/ar.c:289 ../src/nm.c:253 ../src/readelf.c:442 ../src/size.c:219 #: ../src/strip.c:203 ../src/ld.c:957 ../src/elflint.c:238 #: ../src/addr2line.c:185 ../src/findtextrel.c:170 ../src/elfcmp.c:522 #: ../src/ranlib.c:136 ../src/strings.c:227 ../src/unstrip.c:233 @@ -594,7 +594,7 @@ msgstr "" "GARANTIE,\n" "auch nicht für Marktgängigkeit oder Eignung für einen Bestimmten Zweck.\n" -#: ../src/ar.c:294 ../src/nm.c:258 ../src/readelf.c:439 ../src/size.c:224 +#: ../src/ar.c:294 ../src/nm.c:258 ../src/readelf.c:447 ../src/size.c:224 #: ../src/strip.c:208 ../src/ld.c:962 ../src/elflint.c:243 #: ../src/addr2line.c:190 ../src/findtextrel.c:175 ../src/elfcmp.c:527 #: ../src/ranlib.c:141 ../src/strings.c:232 ../src/unstrip.c:238 @@ -731,7 +731,7 @@ msgstr "\"Konnte ELF-Kopf von %s(%s): %s nicht lesen" #: ../src/nm.c:74 ../src/readelf.c:72 ../src/strip.c:72 msgid "Output selection:" -msgstr "Auswahl der Ausgabe:" +msgstr "" #: ../src/nm.c:75 msgid "Display debugger-only symbols" @@ -885,12 +885,12 @@ msgstr "%s%s%s: Dateiformat nicht erkannt" msgid "cannot create search tree" msgstr "Kann Suchbaum nicht erstellen" -#: ../src/nm.c:740 ../src/nm.c:1002 ../src/readelf.c:852 ../src/readelf.c:995 -#: ../src/readelf.c:1136 ../src/readelf.c:1318 ../src/readelf.c:1516 -#: ../src/readelf.c:1702 ../src/readelf.c:1912 ../src/readelf.c:2166 -#: ../src/readelf.c:2232 ../src/readelf.c:2310 ../src/readelf.c:2807 -#: ../src/readelf.c:2843 ../src/readelf.c:2905 ../src/readelf.c:6397 -#: ../src/readelf.c:7263 ../src/readelf.c:7408 ../src/readelf.c:7477 +#: ../src/nm.c:740 ../src/nm.c:1002 ../src/readelf.c:860 ../src/readelf.c:1003 +#: ../src/readelf.c:1144 ../src/readelf.c:1326 ../src/readelf.c:1524 +#: ../src/readelf.c:1710 ../src/readelf.c:1920 ../src/readelf.c:2174 +#: ../src/readelf.c:2240 ../src/readelf.c:2318 ../src/readelf.c:2815 +#: ../src/readelf.c:2851 ../src/readelf.c:2913 ../src/readelf.c:6406 +#: ../src/readelf.c:7272 ../src/readelf.c:7417 ../src/readelf.c:7486 #: ../src/size.c:425 ../src/size.c:499 ../src/strip.c:482 ../src/objdump.c:744 #, c-format msgid "cannot get section header string table index" @@ -969,11 +969,11 @@ msgstr "" #: ../src/readelf.c:78 msgid "Display the program headers" -msgstr "" +msgstr "Programm-Köpfe anzeigen" #: ../src/readelf.c:80 msgid "Display relocations" -msgstr "" +msgstr "Relocations anzeigen" #: ../src/readelf.c:81 msgid "Display the sections' header" @@ -981,11 +981,11 @@ msgstr "" #: ../src/readelf.c:83 msgid "Display the symbol table" -msgstr "" +msgstr "Symboltabelle anzeigen" #: ../src/readelf.c:84 msgid "Display versioning information" -msgstr "" +msgstr "Versionierungsinformationen anzeigen" #: ../src/readelf.c:86 msgid "" @@ -995,11 +995,11 @@ msgstr "" #: ../src/readelf.c:89 msgid "Display the core notes" -msgstr "" +msgstr "Kernnotizen anzeigen" #: ../src/readelf.c:91 msgid "Display architecture specific information (if any)" -msgstr "" +msgstr "Architekturspezifische Informationen anzeigen (falls vorhanden)" #: ../src/readelf.c:93 msgid "Dump the uninterpreted contents of SECTION, by number or name" @@ -1011,283 +1011,287 @@ msgstr "" #: ../src/readelf.c:98 msgid "Display the symbol index of an archive" -msgstr "" +msgstr "Symbolindex des Archivs anzeigen" #: ../src/readelf.c:99 msgid "Display sections for exception handling" -msgstr "" +msgstr "Abschnitte für Ausnahmebehandlung anzeigen" #: ../src/readelf.c:102 msgid "Output control:" -msgstr "" +msgstr "Ausgabekontrolle:" + +#: ../src/readelf.c:104 +msgid "Do not find symbol names for addresses in DWARF data" +msgstr "Keine symbolischen Namen für Adressen in DWARF-Daten suchen" #. Short description of program. -#: ../src/readelf.c:108 +#: ../src/readelf.c:110 msgid "Print information from ELF file in human-readable form." -msgstr "" +msgstr "Informationen aus der ELF-Datei in menschenlesbarer Form ausgeben." #. Strings for arguments in help texts. -#: ../src/readelf.c:112 ../src/elflint.c:85 +#: ../src/readelf.c:114 ../src/elflint.c:85 msgid "FILE..." -msgstr "" +msgstr "DATEI..." -#: ../src/readelf.c:261 ../src/elflint.c:158 +#: ../src/readelf.c:266 ../src/elflint.c:158 #, c-format msgid "cannot open input file" msgstr "Kann Eingabedatei nicht öffnen" -#: ../src/readelf.c:389 +#: ../src/readelf.c:394 #, c-format msgid "Unknown DWARF debug section `%s'.\n" msgstr "" -#: ../src/readelf.c:410 ../src/elflint.c:222 +#: ../src/readelf.c:418 ../src/elflint.c:222 msgid "Missing file name.\n" msgstr "Dateiname fehlt.\n" -#: ../src/readelf.c:415 ../src/objdump.c:236 +#: ../src/readelf.c:423 ../src/objdump.c:236 msgid "No operation specified.\n" msgstr "Keine Operation angegeben.\n" -#: ../src/readelf.c:450 +#: ../src/readelf.c:458 #, c-format msgid "cannot generate Elf descriptor: %s" -msgstr "" +msgstr "konnte Elf-Deskriptor nicht erzeugen: %s" -#: ../src/readelf.c:462 +#: ../src/readelf.c:470 #, c-format msgid "'%s' is not an archive, cannot print archive index" msgstr "" -#: ../src/readelf.c:467 +#: ../src/readelf.c:475 #, c-format msgid "error while closing Elf descriptor: %s" msgstr "" -#: ../src/readelf.c:559 +#: ../src/readelf.c:567 #, c-format msgid "cannot stat input file" msgstr "" -#: ../src/readelf.c:561 +#: ../src/readelf.c:569 #, c-format msgid "input file is empty" msgstr "" -#: ../src/readelf.c:563 +#: ../src/readelf.c:571 #, c-format msgid "failed reading '%s': %s" msgstr "Konnte '%s' nicht lesen: %s" -#: ../src/readelf.c:598 +#: ../src/readelf.c:606 #, c-format msgid "cannot read ELF header: %s" msgstr "" -#: ../src/readelf.c:606 +#: ../src/readelf.c:614 #, c-format msgid "cannot create EBL handle" msgstr "" -#: ../src/readelf.c:613 ../src/strip.c:542 ../src/ldgeneric.c:661 +#: ../src/readelf.c:621 ../src/strip.c:542 ../src/ldgeneric.c:661 #: ../src/ldgeneric.c:1122 #, c-format msgid "cannot determine number of sections: %s" msgstr "" -#: ../src/readelf.c:699 +#: ../src/readelf.c:707 msgid "NONE (None)" msgstr "" -#: ../src/readelf.c:700 +#: ../src/readelf.c:708 msgid "REL (Relocatable file)" msgstr "" -#: ../src/readelf.c:701 +#: ../src/readelf.c:709 msgid "EXEC (Executable file)" msgstr "" -#: ../src/readelf.c:702 +#: ../src/readelf.c:710 msgid "DYN (Shared object file)" msgstr "" -#: ../src/readelf.c:703 +#: ../src/readelf.c:711 msgid "CORE (Core file)" msgstr "" -#: ../src/readelf.c:708 +#: ../src/readelf.c:716 #, c-format msgid "OS Specific: (%x)\n" msgstr "" #. && e_type <= ET_HIPROC always true -#: ../src/readelf.c:710 +#: ../src/readelf.c:718 #, c-format msgid "Processor Specific: (%x)\n" msgstr "" -#: ../src/readelf.c:720 +#: ../src/readelf.c:728 msgid "" "ELF Header:\n" " Magic: " msgstr "" -#: ../src/readelf.c:724 +#: ../src/readelf.c:732 #, c-format msgid "" "\n" " Class: %s\n" msgstr "" -#: ../src/readelf.c:729 -#, c-format +#: ../src/readelf.c:737 +#, fuzzy, c-format msgid " Data: %s\n" -msgstr "" +msgstr " Daten: %s\n" -#: ../src/readelf.c:735 +#: ../src/readelf.c:743 #, c-format msgid " Ident Version: %hhd %s\n" msgstr "" -#: ../src/readelf.c:737 ../src/readelf.c:754 +#: ../src/readelf.c:745 ../src/readelf.c:762 msgid "(current)" -msgstr "" +msgstr "(aktuell)" -#: ../src/readelf.c:741 +#: ../src/readelf.c:749 #, c-format msgid " OS/ABI: %s\n" msgstr "" -#: ../src/readelf.c:744 +#: ../src/readelf.c:752 #, c-format msgid " ABI Version: %hhd\n" msgstr "" -#: ../src/readelf.c:747 +#: ../src/readelf.c:755 msgid " Type: " -msgstr "" +msgstr " Typ: " -#: ../src/readelf.c:750 +#: ../src/readelf.c:758 #, c-format msgid " Machine: %s\n" msgstr "" -#: ../src/readelf.c:752 +#: ../src/readelf.c:760 #, c-format msgid " Version: %d %s\n" msgstr "" -#: ../src/readelf.c:756 +#: ../src/readelf.c:764 #, c-format msgid " Entry point address: %#<PRIx64>\n" msgstr "" -#: ../src/readelf.c:759 +#: ../src/readelf.c:767 #, c-format msgid " Start of program headers: %<PRId64> %s\n" msgstr "" -#: ../src/readelf.c:760 ../src/readelf.c:763 +#: ../src/readelf.c:768 ../src/readelf.c:771 msgid "(bytes into file)" msgstr "" -#: ../src/readelf.c:762 +#: ../src/readelf.c:770 #, c-format msgid " Start of section headers: %<PRId64> %s\n" msgstr "" -#: ../src/readelf.c:765 +#: ../src/readelf.c:773 #, c-format msgid " Flags: %s\n" msgstr "" -#: ../src/readelf.c:768 +#: ../src/readelf.c:776 #, c-format msgid " Size of this header: %<PRId16> %s\n" msgstr "" -#: ../src/readelf.c:769 ../src/readelf.c:772 ../src/readelf.c:778 +#: ../src/readelf.c:777 ../src/readelf.c:780 ../src/readelf.c:786 msgid "(bytes)" -msgstr "" +msgstr "(Bytes)" -#: ../src/readelf.c:771 +#: ../src/readelf.c:779 #, c-format msgid " Size of program header entries: %<PRId16> %s\n" msgstr "" -#: ../src/readelf.c:774 +#: ../src/readelf.c:782 #, c-format msgid " Number of program headers entries: %<PRId16>\n" msgstr "" -#: ../src/readelf.c:777 +#: ../src/readelf.c:785 #, c-format msgid " Size of section header entries: %<PRId16> %s\n" msgstr "" -#: ../src/readelf.c:780 +#: ../src/readelf.c:788 #, c-format msgid " Number of section headers entries: %<PRId16>" msgstr "" -#: ../src/readelf.c:787 +#: ../src/readelf.c:795 #, c-format msgid " (%<PRIu32> in [0].sh_size)" msgstr "" -#: ../src/readelf.c:790 ../src/readelf.c:804 +#: ../src/readelf.c:798 ../src/readelf.c:812 msgid " ([0] not available)" msgstr "" #. We managed to get the zeroth section. -#: ../src/readelf.c:800 +#: ../src/readelf.c:808 #, c-format msgid " (%<PRIu32> in [0].sh_link)" msgstr "" -#: ../src/readelf.c:808 +#: ../src/readelf.c:816 #, c-format msgid "" " Section header string table index: XINDEX%s\n" "\n" msgstr "" -#: ../src/readelf.c:812 +#: ../src/readelf.c:820 #, c-format msgid "" " Section header string table index: %<PRId16>\n" "\n" msgstr "" -#: ../src/readelf.c:844 +#: ../src/readelf.c:852 #, c-format msgid "" "There are %d section headers, starting at offset %#<PRIx64>:\n" "\n" msgstr "" -#: ../src/readelf.c:854 +#: ../src/readelf.c:862 msgid "Section Headers:" msgstr "" -#: ../src/readelf.c:857 +#: ../src/readelf.c:865 msgid "" "[Nr] Name Type Addr Off Size ES Flags Lk " "Inf Al" msgstr "" -#: ../src/readelf.c:859 +#: ../src/readelf.c:867 msgid "" "[Nr] Name Type Addr Off Size ES " "Flags Lk Inf Al" msgstr "" -#: ../src/readelf.c:866 ../src/readelf.c:1019 +#: ../src/readelf.c:874 ../src/readelf.c:1027 #, c-format msgid "cannot get section: %s" msgstr "" -#: ../src/readelf.c:873 ../src/readelf.c:1027 ../src/readelf.c:7428 +#: ../src/readelf.c:881 ../src/readelf.c:1035 ../src/readelf.c:7437 #: ../src/unstrip.c:352 ../src/unstrip.c:376 ../src/unstrip.c:426 #: ../src/unstrip.c:535 ../src/unstrip.c:552 ../src/unstrip.c:590 #: ../src/unstrip.c:788 ../src/unstrip.c:1056 ../src/unstrip.c:1243 @@ -1297,40 +1301,40 @@ msgstr "" msgid "cannot get section header: %s" msgstr "" -#: ../src/readelf.c:931 +#: ../src/readelf.c:939 msgid "Program Headers:" -msgstr "" +msgstr "Programm-Köpfe:" -#: ../src/readelf.c:933 +#: ../src/readelf.c:941 msgid "" " Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align" msgstr "" -#: ../src/readelf.c:936 +#: ../src/readelf.c:944 msgid "" " Type Offset VirtAddr PhysAddr FileSiz " "MemSiz Flg Align" msgstr "" -#: ../src/readelf.c:976 +#: ../src/readelf.c:984 #, c-format msgid "\t[Requesting program interpreter: %s]\n" msgstr "" -#: ../src/readelf.c:997 +#: ../src/readelf.c:1005 msgid "" "\n" " Section to Segment mapping:\n" " Segment Sections..." msgstr "" -#: ../src/readelf.c:1008 ../src/unstrip.c:1823 ../src/unstrip.c:1862 +#: ../src/readelf.c:1016 ../src/unstrip.c:1823 ../src/unstrip.c:1862 #: ../src/unstrip.c:1869 #, c-format msgid "cannot get program header: %s" msgstr "" -#: ../src/readelf.c:1142 +#: ../src/readelf.c:1150 #, c-format msgid "" "\n" @@ -1341,7 +1345,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:1147 +#: ../src/readelf.c:1155 #, c-format msgid "" "\n" @@ -1352,15 +1356,15 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:1155 +#: ../src/readelf.c:1163 msgid "<INVALID SYMBOL>" msgstr "" -#: ../src/readelf.c:1169 +#: ../src/readelf.c:1177 msgid "<INVALID SECTION>" msgstr "" -#: ../src/readelf.c:1320 +#: ../src/readelf.c:1328 #, c-format msgid "" "\n" @@ -1373,43 +1377,43 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:1332 +#: ../src/readelf.c:1340 msgid " Type Value\n" msgstr "" -#: ../src/readelf.c:1356 +#: ../src/readelf.c:1364 #, c-format msgid "Shared library: [%s]\n" msgstr "" -#: ../src/readelf.c:1361 +#: ../src/readelf.c:1369 #, c-format msgid "Library soname: [%s]\n" msgstr "" -#: ../src/readelf.c:1366 +#: ../src/readelf.c:1374 #, c-format msgid "Library rpath: [%s]\n" msgstr "" -#: ../src/readelf.c:1371 +#: ../src/readelf.c:1379 #, c-format msgid "Library runpath: [%s]\n" msgstr "" -#: ../src/readelf.c:1391 +#: ../src/readelf.c:1399 #, c-format msgid "%<PRId64> (bytes)\n" msgstr "" -#: ../src/readelf.c:1501 ../src/readelf.c:1687 +#: ../src/readelf.c:1509 ../src/readelf.c:1695 #, c-format msgid "" "\n" "Invalid symbol table at offset %#0<PRIx64>\n" msgstr "" -#: ../src/readelf.c:1519 ../src/readelf.c:1704 +#: ../src/readelf.c:1527 ../src/readelf.c:1712 #, c-format msgid "" "\n" @@ -1425,7 +1429,7 @@ msgstr[1] "" #. The .rel.dyn section does not refer to a specific section but #. instead of section index zero. Do not try to print a section #. name. -#: ../src/readelf.c:1534 +#: ../src/readelf.c:1542 #, c-format msgid "" "\n" @@ -1436,38 +1440,38 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:1544 +#: ../src/readelf.c:1552 msgid " Offset Type Value Name\n" msgstr "" -#: ../src/readelf.c:1546 +#: ../src/readelf.c:1554 msgid " Offset Type Value Name\n" msgstr "" -#: ../src/readelf.c:1599 ../src/readelf.c:1610 ../src/readelf.c:1623 -#: ../src/readelf.c:1641 ../src/readelf.c:1653 ../src/readelf.c:1772 -#: ../src/readelf.c:1784 ../src/readelf.c:1798 ../src/readelf.c:1817 -#: ../src/readelf.c:1830 +#: ../src/readelf.c:1607 ../src/readelf.c:1618 ../src/readelf.c:1631 +#: ../src/readelf.c:1649 ../src/readelf.c:1661 ../src/readelf.c:1780 +#: ../src/readelf.c:1792 ../src/readelf.c:1806 ../src/readelf.c:1825 +#: ../src/readelf.c:1838 msgid "<INVALID RELOC>" msgstr "" -#: ../src/readelf.c:1611 ../src/readelf.c:1785 ../src/objdump.c:379 +#: ../src/readelf.c:1619 ../src/readelf.c:1793 ../src/objdump.c:379 msgid "INVALID SYMBOL" msgstr "" -#: ../src/readelf.c:1642 ../src/readelf.c:1818 ../src/objdump.c:394 +#: ../src/readelf.c:1650 ../src/readelf.c:1826 ../src/objdump.c:394 msgid "INVALID SECTION" msgstr "" -#: ../src/readelf.c:1716 +#: ../src/readelf.c:1724 msgid " Offset Type Value Addend Name\n" msgstr "" -#: ../src/readelf.c:1718 +#: ../src/readelf.c:1726 msgid " Offset Type Value Addend Name\n" msgstr "" -#: ../src/readelf.c:1919 +#: ../src/readelf.c:1927 #, c-format msgid "" "\n" @@ -1478,40 +1482,40 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:1925 +#: ../src/readelf.c:1933 #, c-format msgid " %lu local symbol String table: [%2u] '%s'\n" msgid_plural " %lu local symbols String table: [%2u] '%s'\n" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:1935 +#: ../src/readelf.c:1943 msgid " Num: Value Size Type Bind Vis Ndx Name\n" msgstr "" -#: ../src/readelf.c:1937 +#: ../src/readelf.c:1945 msgid " Num: Value Size Type Bind Vis Ndx Name\n" msgstr "" -#: ../src/readelf.c:1957 +#: ../src/readelf.c:1965 #, c-format msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s" msgstr "" -#: ../src/readelf.c:2045 +#: ../src/readelf.c:2053 #, c-format msgid "bad dynamic symbol" msgstr "" -#: ../src/readelf.c:2127 +#: ../src/readelf.c:2135 msgid "none" msgstr "keine" -#: ../src/readelf.c:2144 +#: ../src/readelf.c:2152 msgid "| <unknown>" msgstr "| <unbekannt>" -#: ../src/readelf.c:2169 +#: ../src/readelf.c:2177 #, c-format msgid "" "\n" @@ -1524,17 +1528,17 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:2192 +#: ../src/readelf.c:2200 #, fuzzy, c-format msgid " %#06x: Version: %hu File: %s Cnt: %hu\n" msgstr " %#06x: Version: %hu Datei: %s Cnt: %hu\n" -#: ../src/readelf.c:2205 +#: ../src/readelf.c:2213 #, c-format msgid " %#06x: Name: %s Flags: %s Version: %hu\n" msgstr " %#06x: Name: %s Flags: %s Version: %hu\n" -#: ../src/readelf.c:2236 +#: ../src/readelf.c:2244 #, c-format msgid "" "\n" @@ -1547,17 +1551,17 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:2266 +#: ../src/readelf.c:2274 #, c-format msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n" msgstr "" -#: ../src/readelf.c:2281 +#: ../src/readelf.c:2289 #, c-format msgid " %#06x: Parent %d: %s\n" msgstr "" -#: ../src/readelf.c:2513 +#: ../src/readelf.c:2521 #, c-format msgid "" "\n" @@ -1570,15 +1574,15 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:2543 +#: ../src/readelf.c:2551 msgid " 0 *local* " msgstr " 0 *lokal* " -#: ../src/readelf.c:2548 +#: ../src/readelf.c:2556 msgid " 1 *global* " msgstr " 1 *global* " -#: ../src/readelf.c:2579 +#: ../src/readelf.c:2587 #, c-format msgid "" "\n" @@ -1593,41 +1597,41 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:2602 +#: ../src/readelf.c:2610 #, c-format msgid " Length Number % of total Coverage\n" msgstr "" -#: ../src/readelf.c:2604 +#: ../src/readelf.c:2612 #, c-format msgid " 0 %6<PRIu32> %5.1f%%\n" msgstr " 0 %6<PRIu32> %5.1f%%\n" -#: ../src/readelf.c:2611 +#: ../src/readelf.c:2619 #, c-format msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n" msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n" -#: ../src/readelf.c:2624 +#: ../src/readelf.c:2632 #, c-format msgid "" " Average number of tests: successful lookup: %f\n" " unsuccessful lookup: %f\n" msgstr "" -#: ../src/readelf.c:2642 ../src/readelf.c:2684 ../src/readelf.c:2725 +#: ../src/readelf.c:2650 ../src/readelf.c:2692 ../src/readelf.c:2733 #, c-format msgid "cannot get data for section %d: %s" msgstr "" -#: ../src/readelf.c:2779 +#: ../src/readelf.c:2787 #, c-format msgid "" " Symbol Bias: %u\n" " Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n" msgstr "" -#: ../src/readelf.c:2853 +#: ../src/readelf.c:2861 #, c-format msgid "" "\n" @@ -1638,13 +1642,13 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:2867 +#: ../src/readelf.c:2875 msgid "" " Library Time Stamp Checksum Version " "Flags" msgstr "" -#: ../src/readelf.c:2917 +#: ../src/readelf.c:2925 #, c-format msgid "" "\n" @@ -1652,132 +1656,132 @@ msgid "" "#0<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:2933 +#: ../src/readelf.c:2941 msgid " Owner Size\n" msgstr "" -#: ../src/readelf.c:2959 +#: ../src/readelf.c:2967 #, c-format msgid " %-13s %4<PRIu32>\n" msgstr " %-13s %4<PRIu32>\n" -#: ../src/readelf.c:2991 +#: ../src/readelf.c:2999 #, c-format msgid " %-4u %12<PRIu32>\n" msgstr " %-4u %12<PRIu32>\n" #. Tag_File -#: ../src/readelf.c:2996 +#: ../src/readelf.c:3004 #, c-format msgid " File: %11<PRIu32>\n" msgstr " File: %11<PRIu32>\n" -#: ../src/readelf.c:3031 +#: ../src/readelf.c:3039 #, c-format msgid " %s: %<PRId64>, %s\n" msgstr " %s: %<PRId64>, %s\n" -#: ../src/readelf.c:3034 +#: ../src/readelf.c:3042 #, c-format msgid " %s: %<PRId64>\n" msgstr " %s: %<PRId64>\n" -#: ../src/readelf.c:3037 +#: ../src/readelf.c:3045 #, c-format msgid " %s: %s\n" msgstr " %s: %s\n" -#: ../src/readelf.c:3044 +#: ../src/readelf.c:3052 #, c-format msgid " %u: %<PRId64>\n" msgstr " %u: %<PRId64>\n" -#: ../src/readelf.c:3047 +#: ../src/readelf.c:3055 #, c-format msgid " %u: %s\n" msgstr " %u: %s\n" -#: ../src/readelf.c:3082 +#: ../src/readelf.c:3091 #, c-format msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>" msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>" -#: ../src/readelf.c:3085 +#: ../src/readelf.c:3094 #, c-format msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>" msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>" -#: ../src/readelf.c:3090 +#: ../src/readelf.c:3099 #, c-format msgid "%#<PRIx64> <%s+%#<PRIx64>>" msgstr "%#<PRIx64> <%s+%#<PRIx64>>" -#: ../src/readelf.c:3093 +#: ../src/readelf.c:3102 #, c-format msgid "%#0*<PRIx64> <%s+%#<PRIx64>>" msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>" -#: ../src/readelf.c:3099 +#: ../src/readelf.c:3108 #, c-format msgid "%s+%#<PRIx64> <%s>" msgstr "%s+%#<PRIx64> <%s>" -#: ../src/readelf.c:3102 +#: ../src/readelf.c:3111 #, c-format msgid "%s+%#0*<PRIx64> <%s>" msgstr "%s+%#0*<PRIx64> <%s>" -#: ../src/readelf.c:3106 +#: ../src/readelf.c:3115 #, c-format msgid "%#<PRIx64> <%s>" msgstr "%#<PRIx64> <%s>" -#: ../src/readelf.c:3109 +#: ../src/readelf.c:3118 #, c-format msgid "%#0*<PRIx64> <%s>" msgstr "%#0*<PRIx64> <%s>" -#: ../src/readelf.c:3114 +#: ../src/readelf.c:3123 #, c-format msgid "%s+%#<PRIx64>" msgstr "%s+%#<PRIx64>" -#: ../src/readelf.c:3117 +#: ../src/readelf.c:3126 #, c-format msgid "%s+%#0*<PRIx64>" msgstr "%s+%#0*<PRIx64>" -#: ../src/readelf.c:3225 +#: ../src/readelf.c:3234 #, c-format msgid "unknown tag %hx" -msgstr "" +msgstr "unbekannter Tag %hx" -#: ../src/readelf.c:3227 +#: ../src/readelf.c:3236 #, c-format msgid "unknown user tag %hx" -msgstr "" +msgstr "unbekannter Benutzer-Tag %hx" -#: ../src/readelf.c:3437 +#: ../src/readelf.c:3446 #, c-format msgid "unknown attribute %hx" -msgstr "" +msgstr "unbekanntes Attribut %hx" -#: ../src/readelf.c:3440 +#: ../src/readelf.c:3449 #, c-format msgid "unknown user attribute %hx" -msgstr "" +msgstr "unbekanntes Benutzer-Attribut %hx" -#: ../src/readelf.c:3486 +#: ../src/readelf.c:3495 #, c-format msgid "unknown form %<PRIx64>" -msgstr "" +msgstr "unbekannte Form %<PRIx64>" -#: ../src/readelf.c:4102 +#: ../src/readelf.c:4111 #, c-format msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n" msgstr "" -#: ../src/readelf.c:4115 +#: ../src/readelf.c:4124 #, c-format msgid "" "\n" @@ -1785,37 +1789,37 @@ msgid "" " [ Code]\n" msgstr "" -#: ../src/readelf.c:4122 +#: ../src/readelf.c:4131 #, c-format msgid "" "\n" "Abbreviation section at offset %<PRIu64>:\n" msgstr "" -#: ../src/readelf.c:4135 +#: ../src/readelf.c:4144 #, c-format msgid " *** error while reading abbreviation: %s\n" msgstr "" -#: ../src/readelf.c:4151 +#: ../src/readelf.c:4160 #, c-format msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n" msgstr "" -#: ../src/readelf.c:4154 +#: ../src/readelf.c:4163 msgid "yes" -msgstr "" +msgstr "ja" -#: ../src/readelf.c:4154 +#: ../src/readelf.c:4163 msgid "no" -msgstr "" +msgstr "nein" -#: ../src/readelf.c:4190 +#: ../src/readelf.c:4199 #, c-format msgid "cannot get .debug_aranges content: %s" msgstr "" -#: ../src/readelf.c:4195 +#: ../src/readelf.c:4204 #, c-format msgid "" "\n" @@ -1826,120 +1830,120 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:4225 +#: ../src/readelf.c:4234 #, c-format msgid " [%*zu] ???\n" -msgstr "" +msgstr " [%*zu] ???\n" -#: ../src/readelf.c:4227 +#: ../src/readelf.c:4236 #, c-format msgid "" " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n" msgstr "" -#: ../src/readelf.c:4246 +#: ../src/readelf.c:4255 #, c-format msgid "cannot get .debug_ranges content: %s" msgstr "" -#: ../src/readelf.c:4251 ../src/readelf.c:4708 ../src/readelf.c:5357 -#: ../src/readelf.c:5802 ../src/readelf.c:5897 ../src/readelf.c:6069 +#: ../src/readelf.c:4260 ../src/readelf.c:4717 ../src/readelf.c:5366 +#: ../src/readelf.c:5811 ../src/readelf.c:5906 ../src/readelf.c:6078 #, c-format msgid "" "\n" "DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:4265 ../src/readelf.c:5816 +#: ../src/readelf.c:4274 ../src/readelf.c:5825 #, c-format msgid " [%6tx] <INVALID DATA>\n" msgstr "" -#: ../src/readelf.c:4287 ../src/readelf.c:5838 +#: ../src/readelf.c:4296 ../src/readelf.c:5847 #, c-format msgid " [%6tx] base address %s\n" msgstr "" #. We have an address range entry. #. First address range entry in a list. -#: ../src/readelf.c:4298 +#: ../src/readelf.c:4307 #, c-format msgid " [%6tx] %s..%s\n" -msgstr "" +msgstr " [%6tx] %s..%s\n" -#: ../src/readelf.c:4300 +#: ../src/readelf.c:4309 #, c-format msgid " %s..%s\n" -msgstr "" +msgstr " %s..%s\n" -#: ../src/readelf.c:4697 ../src/readelf.c:6135 ../src/readelf.c:6237 +#: ../src/readelf.c:4706 ../src/readelf.c:6144 ../src/readelf.c:6246 #, c-format msgid "cannot get %s content: %s" msgstr "" -#: ../src/readelf.c:4704 +#: ../src/readelf.c:4713 #, c-format msgid "" "\n" "Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:4731 ../src/readelf.c:5391 +#: ../src/readelf.c:4740 ../src/readelf.c:5400 #, c-format msgid "invalid data in section [%zu] '%s'" msgstr "" -#: ../src/readelf.c:4753 +#: ../src/readelf.c:4762 #, c-format msgid "" "\n" " [%6tx] Zero terminator\n" msgstr "" -#: ../src/readelf.c:4831 +#: ../src/readelf.c:4840 msgid "FDE address encoding: " msgstr "" -#: ../src/readelf.c:4837 +#: ../src/readelf.c:4846 msgid "LSDA pointer encoding: " msgstr "" -#: ../src/readelf.c:4882 +#: ../src/readelf.c:4891 #, c-format msgid "invalid augmentation encoding" msgstr "" -#: ../src/readelf.c:4953 +#: ../src/readelf.c:4962 #, c-format msgid " (offset: %#<PRIx64>)" msgstr "" -#: ../src/readelf.c:4960 +#: ../src/readelf.c:4969 #, c-format msgid " (end offset: %#<PRIx64>)" msgstr "" -#: ../src/readelf.c:4987 +#: ../src/readelf.c:4996 #, c-format msgid " %-26sLSDA pointer: %#<PRIx64>\n" msgstr "" -#: ../src/readelf.c:5033 +#: ../src/readelf.c:5042 #, c-format msgid "cannot get attribute code: %s" msgstr "" -#: ../src/readelf.c:5041 +#: ../src/readelf.c:5050 #, c-format msgid "cannot get attribute form: %s" msgstr "" -#: ../src/readelf.c:5054 +#: ../src/readelf.c:5063 #, c-format msgid "cannot get attribute value: %s" msgstr "" -#: ../src/readelf.c:5236 +#: ../src/readelf.c:5245 #, c-format msgid "" "\n" @@ -1947,7 +1951,7 @@ msgid "" " [Offset]\n" msgstr "" -#: ../src/readelf.c:5261 +#: ../src/readelf.c:5270 #, c-format msgid "" " Compilation unit at offset %<PRIu64>:\n" @@ -1955,37 +1959,37 @@ msgid "" "<PRIu8>, Offset size: %<PRIu8>\n" msgstr "" -#: ../src/readelf.c:5279 +#: ../src/readelf.c:5288 #, c-format msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s" msgstr "" -#: ../src/readelf.c:5290 +#: ../src/readelf.c:5299 #, c-format msgid "cannot get DIE offset: %s" msgstr "" -#: ../src/readelf.c:5298 +#: ../src/readelf.c:5307 #, c-format msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s" msgstr "" -#: ../src/readelf.c:5327 +#: ../src/readelf.c:5336 #, c-format msgid "cannot get next DIE: %s\n" msgstr "" -#: ../src/readelf.c:5334 +#: ../src/readelf.c:5343 #, c-format msgid "cannot get next DIE: %s" msgstr "" -#: ../src/readelf.c:5369 +#: ../src/readelf.c:5378 #, c-format msgid "cannot get line data section data: %s" msgstr "" -#: ../src/readelf.c:5382 +#: ../src/readelf.c:5391 #, c-format msgid "" "\n" @@ -1993,7 +1997,7 @@ msgid "" msgstr "" #. Print what we got so far. -#: ../src/readelf.c:5434 +#: ../src/readelf.c:5443 #, c-format msgid "" "\n" @@ -2009,163 +2013,163 @@ msgid "" "Opcodes:\n" msgstr "" -#: ../src/readelf.c:5453 +#: ../src/readelf.c:5462 #, c-format msgid "invalid data at offset %tu in section [%zu] '%s'" msgstr "" -#: ../src/readelf.c:5468 +#: ../src/readelf.c:5477 #, c-format msgid " [%*<PRIuFAST8>] %hhu argument\n" msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:5476 +#: ../src/readelf.c:5485 msgid "" "\n" "Directory table:" msgstr "" -#: ../src/readelf.c:5492 +#: ../src/readelf.c:5501 msgid "" "\n" "File name table:\n" " Entry Dir Time Size Name" msgstr "" -#: ../src/readelf.c:5521 +#: ../src/readelf.c:5530 msgid "" "\n" "Line number statements:" msgstr "" -#: ../src/readelf.c:5582 +#: ../src/readelf.c:5591 #, c-format msgid " special opcode %u: address+%u = %s, line%+d = %zu\n" msgstr "" -#: ../src/readelf.c:5602 +#: ../src/readelf.c:5611 #, c-format msgid " extended opcode %u: " msgstr "" -#: ../src/readelf.c:5607 +#: ../src/readelf.c:5616 msgid "end of sequence" msgstr "" -#: ../src/readelf.c:5622 +#: ../src/readelf.c:5631 #, c-format msgid "set address to %s\n" msgstr "" -#: ../src/readelf.c:5643 +#: ../src/readelf.c:5652 #, c-format msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n" msgstr "" #. Unknown, ignore it. -#: ../src/readelf.c:5652 +#: ../src/readelf.c:5661 msgid "unknown opcode" msgstr "" #. Takes no argument. -#: ../src/readelf.c:5664 +#: ../src/readelf.c:5673 msgid " copy" msgstr "" -#: ../src/readelf.c:5674 +#: ../src/readelf.c:5683 #, c-format msgid "advance address by %u to %s\n" msgstr "" -#: ../src/readelf.c:5685 +#: ../src/readelf.c:5694 #, c-format msgid " advance line by constant %d to %<PRId64>\n" msgstr "" -#: ../src/readelf.c:5693 +#: ../src/readelf.c:5702 #, c-format msgid " set file to %<PRIu64>\n" msgstr "" -#: ../src/readelf.c:5703 +#: ../src/readelf.c:5712 #, c-format msgid " set column to %<PRIu64>\n" msgstr "" -#: ../src/readelf.c:5710 +#: ../src/readelf.c:5719 #, c-format msgid " set '%s' to %<PRIuFAST8>\n" msgstr "" #. Takes no argument. -#: ../src/readelf.c:5716 +#: ../src/readelf.c:5725 msgid " set basic block flag" msgstr "" -#: ../src/readelf.c:5726 +#: ../src/readelf.c:5735 #, c-format msgid "advance address by constant %u to %s\n" msgstr "" -#: ../src/readelf.c:5742 +#: ../src/readelf.c:5751 #, c-format msgid "advance address by fixed value %u to %s\n" msgstr "" #. Takes no argument. -#: ../src/readelf.c:5751 +#: ../src/readelf.c:5760 msgid " set prologue end flag" msgstr "" #. Takes no argument. -#: ../src/readelf.c:5756 +#: ../src/readelf.c:5765 msgid " set epilogue begin flag" msgstr "" #. This is a new opcode the generator but not we know about. #. Read the parameters associated with it but then discard #. everything. Read all the parameters for this opcode. -#: ../src/readelf.c:5765 +#: ../src/readelf.c:5774 #, c-format msgid " unknown opcode with %<PRIu8> parameter:" msgid_plural " unknown opcode with %<PRIu8> parameters:" msgstr[0] "" msgstr[1] "" -#: ../src/readelf.c:5797 +#: ../src/readelf.c:5806 #, c-format msgid "cannot get .debug_loc content: %s" msgstr "" #. First entry in a list. -#: ../src/readelf.c:5852 +#: ../src/readelf.c:5861 #, c-format msgid " [%6tx] %s..%s" -msgstr "" +msgstr " [%6tx] %s..%s" -#: ../src/readelf.c:5854 +#: ../src/readelf.c:5863 #, c-format msgid " %s..%s" -msgstr "" +msgstr " %s..%s" -#: ../src/readelf.c:5907 +#: ../src/readelf.c:5916 #, c-format msgid "cannot get macro information section data: %s" msgstr "" -#: ../src/readelf.c:5986 +#: ../src/readelf.c:5995 #, c-format msgid "%*s*** non-terminated string at end of section" msgstr "" -#: ../src/readelf.c:6054 +#: ../src/readelf.c:6063 #, c-format msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n" msgstr "" -#: ../src/readelf.c:6093 +#: ../src/readelf.c:6102 #, c-format msgid "" "\n" @@ -2173,47 +2177,47 @@ msgid "" " %*s String\n" msgstr "" -#: ../src/readelf.c:6107 +#: ../src/readelf.c:6116 #, c-format msgid " *** error while reading strings: %s\n" msgstr "" -#: ../src/readelf.c:6127 +#: ../src/readelf.c:6136 #, c-format msgid "" "\n" "Call frame search table section [%2zu] '.eh_frame_hdr':\n" msgstr "" -#: ../src/readelf.c:6229 +#: ../src/readelf.c:6238 #, c-format msgid "" "\n" "Exception handling table section [%2zu] '.gcc_except_table':\n" msgstr "" -#: ../src/readelf.c:6252 +#: ../src/readelf.c:6261 #, c-format msgid " LPStart encoding: %#x " msgstr "" -#: ../src/readelf.c:6264 +#: ../src/readelf.c:6273 #, c-format msgid " TType encoding: %#x " msgstr "" -#: ../src/readelf.c:6278 +#: ../src/readelf.c:6287 #, c-format msgid " Call site encoding: %#x " msgstr "" -#: ../src/readelf.c:6291 +#: ../src/readelf.c:6300 msgid "" "\n" " Call site table:" msgstr "" -#: ../src/readelf.c:6305 +#: ../src/readelf.c:6314 #, c-format msgid "" " [%4u] Call site start: %#<PRIx64>\n" @@ -2222,143 +2226,143 @@ msgid "" " Action: %u\n" msgstr "" -#: ../src/readelf.c:6365 +#: ../src/readelf.c:6374 #, c-format msgid "invalid TType encoding" msgstr "" -#: ../src/readelf.c:6388 +#: ../src/readelf.c:6397 #, c-format msgid "cannot get debug context descriptor: %s" msgstr "" -#: ../src/readelf.c:6523 ../src/readelf.c:7101 +#: ../src/readelf.c:6532 ../src/readelf.c:7110 #, c-format msgid "cannot convert core note data: %s" msgstr "" -#: ../src/readelf.c:6828 +#: ../src/readelf.c:6837 #, c-format msgid "" "\n" "%*s... <repeats %u more times> ..." msgstr "" -#: ../src/readelf.c:6870 +#: ../src/readelf.c:6879 #, c-format msgid "unable to handle register number %d" msgstr "" -#: ../src/readelf.c:7017 +#: ../src/readelf.c:7026 #, c-format msgid "cannot get register info: %s" msgstr "" -#: ../src/readelf.c:7041 +#: ../src/readelf.c:7050 #, c-format msgid "cannot register info: %s" msgstr "" -#: ../src/readelf.c:7199 +#: ../src/readelf.c:7208 msgid " Owner Data size Type\n" msgstr "" -#: ../src/readelf.c:7217 +#: ../src/readelf.c:7226 #, c-format msgid " %-13.*s %9<PRId32> %s\n" msgstr "" -#: ../src/readelf.c:7248 +#: ../src/readelf.c:7257 #, c-format msgid "cannot get content of note section: %s" msgstr "" -#: ../src/readelf.c:7275 +#: ../src/readelf.c:7284 #, c-format msgid "" "\n" "Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:7298 +#: ../src/readelf.c:7307 #, c-format msgid "" "\n" "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:7344 +#: ../src/readelf.c:7353 #, c-format msgid "" "\n" "Section [%Zu] '%s' has no data to dump.\n" msgstr "" -#: ../src/readelf.c:7350 ../src/readelf.c:7372 +#: ../src/readelf.c:7359 ../src/readelf.c:7381 #, c-format msgid "cannot get data for section [%Zu] '%s': %s" msgstr "" -#: ../src/readelf.c:7354 +#: ../src/readelf.c:7363 #, c-format msgid "" "\n" "Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:7367 +#: ../src/readelf.c:7376 #, c-format msgid "" "\n" "Section [%Zu] '%s' is empty.\n" msgstr "" -#: ../src/readelf.c:7376 +#: ../src/readelf.c:7385 #, c-format msgid "" "\n" "String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n" msgstr "" -#: ../src/readelf.c:7423 +#: ../src/readelf.c:7432 #, c-format msgid "" "\n" "section [%lu] does not exist" msgstr "" -#: ../src/readelf.c:7449 +#: ../src/readelf.c:7458 #, c-format msgid "" "\n" "section '%s' does not exist" msgstr "" -#: ../src/readelf.c:7510 +#: ../src/readelf.c:7519 #, c-format msgid "cannot get symbol index of archive '%s': %s" msgstr "" -#: ../src/readelf.c:7513 +#: ../src/readelf.c:7522 #, c-format msgid "" "\n" "Archive '%s' has no symbol index\n" msgstr "" -#: ../src/readelf.c:7517 +#: ../src/readelf.c:7526 #, c-format msgid "" "\n" "Index of archive '%s' has %Zu entries:\n" msgstr "" -#: ../src/readelf.c:7535 +#: ../src/readelf.c:7544 #, c-format msgid "cannot extract member at offset %Zu in '%s': %s" msgstr "" -#: ../src/readelf.c:7540 +#: ../src/readelf.c:7549 #, c-format msgid "Archive member '%s' contains:\n" msgstr "" @@ -2409,7 +2413,7 @@ msgstr "" #: ../src/size.c:269 #, c-format msgid "Invalid format: %s" -msgstr "" +msgstr "Ungültiges Format: %s" #: ../src/size.c:280 #, c-format @@ -2689,7 +2693,7 @@ msgstr "" #: ../src/ld.c:138 msgid "ADDRESS" -msgstr "" +msgstr "ADRESSE" #: ../src/ld.c:138 msgid "Set entry point address." @@ -2824,7 +2828,7 @@ msgstr "[DATEI]..." #: ../src/ld.c:333 #, c-format msgid "At least one input file needed" -msgstr "" +msgstr "Mindestens eine Eingabedatei benötigt" #: ../src/ld.c:349 #, c-format @@ -2839,12 +2843,12 @@ msgstr "" #: ../src/ld.c:397 #, c-format msgid "-( without matching -)" -msgstr "" +msgstr "-( ohne Übereinstimmung -)" #: ../src/ld.c:572 ../src/ld.c:610 #, c-format msgid "only one option of -G and -r is allowed" -msgstr "" +msgstr "nur eine Option aus -G und -r erlaubt" #: ../src/ld.c:594 #, c-format @@ -2874,7 +2878,7 @@ msgstr "" #: ../src/ld.c:785 #, c-format msgid "More than one output file name given." -msgstr "" +msgstr "Mehr als ein Name der Ausgabedatei angegeben." #: ../src/ld.c:802 #, c-format @@ -2889,12 +2893,12 @@ msgstr "" #: ../src/ld.c:869 #, c-format msgid "-) without matching -(" -msgstr "" +msgstr "-) ohne Übereinstimmung -(" #: ../src/ld.c:1046 #, c-format msgid "unknown option '-%c %s'" -msgstr "" +msgstr "unbekannte Option '-%c %s'" #: ../src/ld.c:1150 #, c-format @@ -3148,7 +3152,7 @@ msgstr "" #: ../src/ldgeneric.c:5745 #, c-format msgid "cannot create versioning section: %s" -msgstr "" +msgstr "konnte Versionierungsabschnitt nicht erstellen: %s" #: ../src/ldgeneric.c:5818 #, c-format @@ -3158,7 +3162,7 @@ msgstr "" #: ../src/ldgeneric.c:5994 #, c-format msgid "cannot create versioning data: %s" -msgstr "" +msgstr "konnte Versionierungsdaten nicht erstellen: %s" #: ../src/ldgeneric.c:6094 ../src/ldgeneric.c:6107 ../src/ldgeneric.c:6171 #: ../src/ldgeneric.c:6179 @@ -3174,7 +3178,7 @@ msgstr "" #: ../src/ldgeneric.c:6259 #, c-format msgid "cannot create program header: %s" -msgstr "" +msgstr "konnte Programm-Kopf nicht erstellen: %s" #: ../src/ldgeneric.c:6267 #, c-format @@ -4921,9 +4925,9 @@ msgid "[ADDR...]" msgstr "" #: ../src/addr2line.c:405 -#, c-format +#, fuzzy, c-format msgid "Section syntax requires exactly one module" -msgstr "" +msgstr "Abschnitt syntax benötigt genau ein Modul" #: ../src/addr2line.c:428 #, c-format @@ -4933,7 +4937,7 @@ msgstr "" #: ../src/addr2line.c:461 #, c-format msgid "cannot find symbol '%s'" -msgstr "" +msgstr "Konnte Symbol '%s' nicht finden" #: ../src/addr2line.c:466 #, c-format @@ -5068,12 +5072,13 @@ msgstr "" #. Strings for arguments in help texts. #: ../src/elfcmp.c:84 +#, fuzzy msgid "FILE1 FILE2" -msgstr "" +msgstr "DATEI1 DATEI2" #: ../src/elfcmp.c:140 msgid "Invalid number of parameters.\n" -msgstr "" +msgstr "Ungültige Anzahl von Parametern.\n" #: ../src/elfcmp.c:168 ../src/elfcmp.c:173 #, c-format @@ -5305,12 +5310,12 @@ msgstr "-n kann nicht mit expliziten Dateien oder -o oder -d verwendet werden" #: ../src/unstrip.c:189 #, c-format msgid "output directory '%s'" -msgstr "" +msgstr "Ausgabeverzeichnis '%s'" #: ../src/unstrip.c:198 #, c-format msgid "exactly two file arguments are required" -msgstr "" +msgstr "genau zwei Datei-Argumente werden benötigt" #: ../src/unstrip.c:204 #, c-format @@ -5335,12 +5340,12 @@ msgstr "" #: ../src/unstrip.c:263 ../src/unstrip.c:1816 #, c-format msgid "cannot create program headers: %s" -msgstr "" +msgstr "konnte Programm-Kopf nicht erstellen: %s" #: ../src/unstrip.c:269 #, c-format msgid "cannot copy program header: %s" -msgstr "" +msgstr "konnte Programm-Kopf nicht kopieren: %s" #: ../src/unstrip.c:279 #, c-format @@ -5350,29 +5355,29 @@ msgstr "" #: ../src/unstrip.c:282 ../src/unstrip.c:1504 #, c-format msgid "cannot get section data: %s" -msgstr "" +msgstr "konnte Abschnittsdaten nicht holen: %s" #: ../src/unstrip.c:284 ../src/unstrip.c:1506 #, c-format msgid "cannot copy section data: %s" -msgstr "" +msgstr "konnte Abschnittsdaten nicht kopieren: %s" #: ../src/unstrip.c:308 #, c-format msgid "cannot create directory '%s'" -msgstr "" +msgstr "konnte Verzeichnis nicht erstellen: %s" #: ../src/unstrip.c:348 ../src/unstrip.c:762 ../src/unstrip.c:1539 #, c-format msgid "cannot get symbol table entry: %s" -msgstr "" +msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s" #: ../src/unstrip.c:364 ../src/unstrip.c:579 ../src/unstrip.c:600 #: ../src/unstrip.c:612 ../src/unstrip.c:1560 ../src/unstrip.c:1690 #: ../src/unstrip.c:1714 #, c-format msgid "cannot update symbol table: %s" -msgstr "" +msgstr "konnte Symboltabelle nicht aktualisieren: %s" #: ../src/unstrip.c:381 ../src/unstrip.c:431 ../src/unstrip.c:561 #: ../src/unstrip.c:1208 ../src/unstrip.c:1524 ../src/unstrip.c:1719 @@ -5464,7 +5469,7 @@ msgstr "" #: ../src/unstrip.c:1826 #, c-format msgid "cannot update program header: %s" -msgstr "" +msgstr "konnte Programm-Kopf nicht aktualisieren: %s" #: ../src/unstrip.c:1831 ../src/unstrip.c:1910 #, c-format diff --git a/src/ChangeLog b/src/ChangeLog index a0402416..190a33d7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2009-07-01 Roland McGrath <roland@redhat.com> + + * dwarfcmp.cc (talker): Update constructor parameters. + 2009-06-19 Roland McGrath <roland@redhat.com> * dwarfcmp.cc: Revamp using dwarf_comparator. @@ -179,6 +183,12 @@ * dwarflint.c: Checking for zero padding and unreferenced bytes. CU size and padding at the end of CU are now checked. +2009-06-28 Roland McGrath <roland@redhat.com> + + * readelf.c (print_address_names): New static variable. + (options, parse_opt): Grok -N/--numeric-addresses to clear it. + (format_dwarf_addr): Don't look up name if !print_address_names. + 2009-06-13 Ulrich Drepper <drepper@redhat.com> * ldgeneric.c: Don't use deprecated libelf functions. diff --git a/src/dwarfcmp.cc b/src/dwarfcmp.cc index cffa5fa1..677a5beb 100644 --- a/src/dwarfcmp.cc +++ b/src/dwarfcmp.cc @@ -129,6 +129,7 @@ template<class dwarf1, class dwarf2> struct talker : public dwarf_ref_tracker<dwarf1, dwarf2> { typedef dwarf_tracker_base<dwarf1, dwarf2> _base; + typedef dwarf_ref_tracker<dwarf1, dwarf2> _tracker; typedef typename _base::cu1 cu1; typedef typename _base::cu2 cu2; typedef typename _base::die1 die1; @@ -139,7 +140,17 @@ struct talker : public dwarf_ref_tracker<dwarf1, dwarf2> const typename dwarf1::debug_info_entry *a_; const typename dwarf2::debug_info_entry *b_; - inline talker () : a_ (NULL), b_ (NULL) {} + inline talker () + : a_ (NULL), b_ (NULL) + {} + + inline talker (const talker &proto, typename _tracker::reference_match &m, + const typename _tracker::left_context_type &l, const die1 &a, + const typename _tracker::right_context_type &r, const die2 &b) + : _tracker (static_cast<const _tracker &> (proto), m, l, a, r, b), + a_ (NULL), b_ (NULL) + { + } inline ostream &location () const { @@ -314,8 +325,10 @@ main (int argc, char *argv[]) if (test_writer) { - dwarf_edit edit1 (file1); - dwarf_edit edit2 (file2); + dwarf_ref_tracker<dwarf_edit, dwarf> t1; + dwarf_ref_tracker<dwarf_edit, dwarf> t2; + dwarf_edit edit1 (file1, &t1); + dwarf_edit edit2 (file2, &t2); test_classes (file1, file2, edit1, edit2, same); { diff --git a/src/readelf.c b/src/readelf.c index 8564c6ad..e925565b 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -101,6 +101,8 @@ static const struct argp_option options[] = 0 }, { NULL, 0, NULL, 0, N_("Output control:"), 0 }, + { "numeric-addresses", 'N', NULL, 0, + N_("Do not find symbol names for addresses in DWARF data"), 0 }, { NULL, 0, NULL, 0, NULL, 0 } }; @@ -166,6 +168,9 @@ static bool print_archive_index; /* True if any of the control options except print_archive_index is set. */ static bool any_control_option; +/* True if we should print addresses from DWARF in symbolic form. */ +static bool print_address_names = true; + /* Select printing of debugging sections. */ static enum section_e { @@ -407,6 +412,9 @@ parse_opt (int key, char *arg, add_dump_section (arg); any_control_option = true; break; + case 'N': + print_address_names = false; + break; case ARGP_KEY_NO_ARGS: fputs (gettext ("Missing file name.\n"), stderr); goto do_argp_help; @@ -3062,7 +3070,8 @@ format_dwarf_addr (Dwfl_Module *dwflmod, { /* See if there is a name we can give for this address. */ GElf_Sym sym; - const char *name = dwfl_module_addrsym (dwflmod, address, &sym, NULL); + const char *name = print_address_names + ? dwfl_module_addrsym (dwflmod, address, &sym, NULL) : NULL; if (name != NULL) sym.st_value = address - sym.st_value; diff --git a/tests/ChangeLog b/tests/ChangeLog index 3c734f45..b988cfec 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2009-07-01 Roland McGrath <roland@redhat.com> + + * run-dwarfcmp-self.sh: Run on dwarflint too. + Fiddle failure output. + 2009-06-15 Roland McGrath <roland@redhat.com> * dwarf-print.cc: Include <cstdio>. diff --git a/tests/dwarf_edit.cc b/tests/dwarf_edit.cc index 7c4b3ecf..35e6b1c2 100644 --- a/tests/dwarf_edit.cc +++ b/tests/dwarf_edit.cc @@ -56,8 +56,11 @@ main (int argc, char **argv) cu.attributes ()[DW_AT_name].source_file () = "source-file.c"; - cu.add_entry (DW_TAG_subprogram) - .attributes ()[DW_AT_name].identifier () = "foo"; + dwarf_edit::debug_info_entry &ent = cu.add_entry (DW_TAG_subprogram); + + ent.attributes ()[DW_AT_name].identifier () = "foo"; + + ent.attributes ()[DW_AT_description] = ent.attributes ()[DW_AT_name]; print_file ("consed", f, depth); diff --git a/tests/run-dwarfcmp-self.sh b/tests/run-dwarfcmp-self.sh index 927083ed..cce6641a 100755 --- a/tests/run-dwarfcmp-self.sh +++ b/tests/run-dwarfcmp-self.sh @@ -26,21 +26,27 @@ . $srcdir/test-subr.sh status=0 +run_one() +{ + file="$1"; shift + testrun ../src/dwarfcmp "$@" "$file" "$file" || + { echo "*** failure in dwarfcmp-self $* on $file"; status=1; } +} + runtest() { for file; do if [ -f $file ]; then - { testrun ../src/dwarfcmp -q -i $file $file && - testrun ../src/dwarfcmp -i $file $file && - testrun ../src/dwarfcmp -T -q -i $file $file - } || - { echo "*** failure in $file"; status=1; } + run_one "$file" -i -q + run_one "$file" -i + run_one "$file" -i -q -T fi done } runtest ../src/addr2line runtest ../src/dwarfcmp +runtest ../src/dwarflint runtest ../src/elfcmp runtest ../src/elflint runtest ../src/findtextrel |