[PATCH][GOLD] Handle symbols with section index SHN_XINDEX correctly.

Doug Kwan (關振德) dougkwan@google.com
Thu Apr 8 01:59:00 GMT 2010


Hi Ian,

    This patch fixes a problem in which the special section index
SHN_XINDEX is treated as a normal section index.  That problem caused
some objects with more than 64K sections not scanned properly for the
Cortex-A8 erratum.  A similar problem was also found elsewhere and it
is also fixed by patch.

-Doug

2010-04-07  Doug Kwan  <dougkwan@google.com>

        * arm.cc (Arm_relobj::scan_section_for_cortex_a8_erratum): Warn
        if section is marked as containing instructions but has no mapping
        symbols.
        (Arm_relobj::do_count_local_symbols): Call adjust_sym_shndx to get
        correct section index.
        (Arm_relobj::find_linked_text_section): Ditto.
-------------- next part --------------
Index: gold/arm.cc
===================================================================
RCS file: /cvs/src/src/gold/arm.cc,v
retrieving revision 1.97
diff -u -u -p -r1.97 arm.cc
--- gold/arm.cc	7 Apr 2010 21:42:22 -0000	1.97
+++ gold/arm.cc	8 Apr 2010 01:41:10 -0000
@@ -5866,9 +5866,16 @@ Arm_relobj<big_endian>::scan_section_for
     this->mapping_symbols_info_.lower_bound(section_start);
 
   // There are no mapping symbols for this section.  Treat it as a data-only
-  // section.
+  // section.  Issue a warning if section is marked as containing
+  // instructions.
   if (p == this->mapping_symbols_info_.end() || p->first.first != shndx)
-    return;
+    {
+      if ((this->section_flags(shndx) & elfcpp::SHF_EXECINSTR) != 0)
+	gold_warning(_("cannot scan executable section %u of %s for Cortex-A8 "
+		       "erratum because it has no mapping symbols."),
+		     shndx, this->name().c_str());
+      return;
+    }
 
   Arm_address output_address =
     this->simple_input_section_output_address(shndx, os);
@@ -6101,7 +6108,9 @@ Arm_relobj<big_endian>::do_count_local_s
       const char* sym_name = pnames + sym.get_st_name();
       if (Target_arm<big_endian>::is_mapping_symbol_name(sym_name))
 	{
-	  unsigned int input_shndx = sym.get_st_shndx();  
+	  bool is_ordinary;
+	  unsigned int input_shndx =
+	    this->adjust_sym_shndx(i, sym.get_st_shndx(), &is_ordinary);
 
 	  // Strip of LSB in case this is a THUMB symbol.
 	  Mapping_symbol_position msp(input_shndx, input_value & ~1U);
@@ -6284,7 +6293,9 @@ Arm_relobj<big_endian>::find_linked_text
       elfcpp::Sym<32, big_endian> sym(psyms + r_sym * sym_size);
       if (sym.get_st_type() == elfcpp::STT_SECTION)
 	{
-	  *pshndx = this->adjust_shndx(sym.get_st_shndx());
+	  bool is_ordinary;
+	  *pshndx =
+	    this->adjust_sym_shndx(r_sym, sym.get_st_shndx(), &is_ordinary);
 	  return true;
 	}
       else


More information about the Binutils mailing list