aboutsummaryrefslogtreecommitdiff
path: root/gold/arm.cc
diff options
context:
space:
mode:
authorDoug Kwan <dougkwan@google.com>2010-04-08 06:56:15 +0000
committerDoug Kwan <dougkwan@google.com>2010-04-08 06:56:15 +0000
commit24af6f9228b80380fab3fe3fdb4ba82a4a10b13b (patch)
tree1b4be9c798828a6a6a7fd18060f6304d3cd3b1dc /gold/arm.cc
parenteb5cda8649d496847e9ae93b06ec80a94a5edb84 (diff)
downloadgdb-24af6f9228b80380fab3fe3fdb4ba82a4a10b13b.zip
gdb-24af6f9228b80380fab3fe3fdb4ba82a4a10b13b.tar.gz
gdb-24af6f9228b80380fab3fe3fdb4ba82a4a10b13b.tar.bz2
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.
Diffstat (limited to 'gold/arm.cc')
-rw-r--r--gold/arm.cc21
1 files changed, 17 insertions, 4 deletions
diff --git a/gold/arm.cc b/gold/arm.cc
index c2ac5a0..c9e730b 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -5866,9 +5866,16 @@ Arm_relobj<big_endian>::scan_section_for_cortex_a8_erratum(
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,10 @@ Arm_relobj<big_endian>::do_count_local_symbols(
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);
+ gold_assert(is_ordinary);
// Strip of LSB in case this is a THUMB symbol.
Mapping_symbol_position msp(input_shndx, input_value & ~1U);
@@ -6284,7 +6294,10 @@ Arm_relobj<big_endian>::find_linked_text_section(
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);
+ gold_assert(is_ordinary);
return true;
}
else