diff options
Diffstat (limited to 'binutils-2.19/gold/icf.cc')
-rw-r--r-- | binutils-2.19/gold/icf.cc | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/binutils-2.19/gold/icf.cc b/binutils-2.19/gold/icf.cc index ff2058c..47b6c60 100644 --- a/binutils-2.19/gold/icf.cc +++ b/binutils-2.19/gold/icf.cc @@ -263,8 +263,11 @@ get_section_contents(bool first_iteration, { Icf::Sections_reachable_info v = (it_reloc_info_list->second).section_info; + // Stores the information of the symbol pointed to by the reloc. Icf::Symbol_info s = (it_reloc_info_list->second).symbol_info; + // Stores the addend and the symbol value. Icf::Addend_info a = (it_reloc_info_list->second).addend_info; + // Stores the offset of the reloc. Icf::Offset_info o = (it_reloc_info_list->second).offset_info; Icf::Sections_reachable_info::iterator it_v = v.begin(); Icf::Symbol_info::iterator it_s = s.begin(); @@ -285,6 +288,24 @@ get_section_contents(bool first_iteration, static_cast<long long>((*it_a).first), static_cast<long long>((*it_a).second), static_cast<unsigned long long>(*it_o)); + + // If the symbol pointed to by the reloc is not in an ordinary + // section or if the symbol type is not FROM_OBJECT, then the + // object is NULL. + if (it_v->first == NULL) + { + if (first_iteration) + { + // If the symbol name is available, use it. + if ((*it_s) != NULL) + buffer.append((*it_s)->name()); + // Append the addend. + buffer.append(addend_str); + buffer.append("@"); + } + continue; + } + Section_id reloc_secn(it_v->first, it_v->second); // If this reloc turns back and points to the same section, @@ -304,7 +325,12 @@ get_section_contents(bool first_iteration, symtab->icf()->section_to_int_map(); Icf::Uniq_secn_id_map::iterator section_id_map_it = section_id_map.find(reloc_secn); - if (section_id_map_it != section_id_map.end()) + bool is_sym_preemptible = (*it_s != NULL + && !(*it_s)->is_from_dynobj() + && !(*it_s)->is_undefined() + && (*it_s)->is_preemptible()); + if (!is_sym_preemptible + && section_id_map_it != section_id_map.end()) { // This is a reloc to a section that might be folded. if (num_tracked_relocs) @@ -338,7 +364,14 @@ get_section_contents(bool first_iteration, { uint64_t entsize = (it_v->first)->section_entsize(it_v->second); - long long offset = it_a->first + it_a->second; + long long offset = it_a->first; + + unsigned long long addend = it_a->second; + // Ignoring the addend when it is a negative value. See the + // comments in Merged_symbol_value::Value in object.h. + if (addend < 0xffffff00) + offset = offset + addend; + section_size_type secn_len; const unsigned char* str_contents = (it_v->first)->section_contents(it_v->second, @@ -389,12 +422,12 @@ get_section_contents(bool first_iteration, char*>(str_contents), entsize); } + buffer.append("@"); } else if ((*it_s) != NULL) { // If symbol name is available use that. - const char *sym_name = (*it_s)->name(); - buffer.append(sym_name); + buffer.append((*it_s)->name()); // Append the addend. buffer.append(addend_str); buffer.append("@"); |