diff options
author | Jing Yu <jingyu@google.com> | 2014-12-10 15:36:56 -0800 |
---|---|---|
committer | Jing Yu <jingyu@google.com> | 2014-12-10 15:39:13 -0800 |
commit | 0bf32ea9e678df657d306fe28aecac7307debdce (patch) | |
tree | e47f21f371674dac810df9b1ae95463bcdc536c5 /gold/aarch64.cc | |
parent | fc1269757f5614cd893c36120f61a5014a45fe37 (diff) | |
download | gdb-0bf32ea9e678df657d306fe28aecac7307debdce.zip gdb-0bf32ea9e678df657d306fe28aecac7307debdce.tar.gz gdb-0bf32ea9e678df657d306fe28aecac7307debdce.tar.bz2 |
Give informative error message for stub-group-size
This patch gives current stub-group-size in error message when stub
is too far away.
* aarch64.cc (Target_aarch64): Add new variable: stub_group_size_.
(AArch64_relocate_functions::maybe_apply_stub): Add new parameter.
Update error message.
(Target_aarch64::do_relax): Use absolute value of option
stub_group_size. Replace local variable with class member
stub_group_size_.
Diffstat (limited to 'gold/aarch64.cc')
-rw-r--r-- | gold/aarch64.cc | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/gold/aarch64.cc b/gold/aarch64.cc index d5a0a85..f2505d6 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -1653,7 +1653,7 @@ class Target_aarch64 : public Sized_target<size, big_endian> rela_irelative_(NULL), copy_relocs_(elfcpp::R_AARCH64_COPY), got_mod_index_offset_(-1U), tlsdesc_reloc_info_(), tls_base_symbol_defined_(false), - stub_tables_(), aarch64_input_section_map_() + stub_tables_(), stub_group_size_(0), aarch64_input_section_map_() { } // Scan the relocations to determine unreferenced sections for @@ -2214,6 +2214,8 @@ class Target_aarch64 : public Sized_target<size, big_endian> bool tls_base_symbol_defined_; // List of stub_tables Stub_table_list stub_tables_; + // Actual stub group size + section_size_type stub_group_size_; AArch64_input_section_map aarch64_input_section_map_; }; // End of Target_aarch64 @@ -4148,7 +4150,8 @@ class AArch64_relocate_functions Address, const Sized_symbol<size>*, const Symbol_value<size>*, - const Sized_relobj_file<size, big_endian>*); + const Sized_relobj_file<size, big_endian>*, + section_size_type); }; // End of AArch64_relocate_functions @@ -4168,7 +4171,8 @@ maybe_apply_stub(unsigned int r_type, Address address, const Sized_symbol<size>* gsym, const Symbol_value<size>* psymval, - const Sized_relobj_file<size, big_endian>* object) + const Sized_relobj_file<size, big_endian>* object, + section_size_type current_group_size) { if (parameters->options().relocatable()) return false; @@ -4200,7 +4204,8 @@ maybe_apply_stub(unsigned int r_type, rela_general<32>(view, branch_offset, 0, arp); if (status != This::STATUS_OKAY) gold_error(_("Stub is too far away, try a smaller value " - "for '--stub-group-size'. For example, 0x2000000.")); + "for '--stub-group-size'. The current value is 0x%lx."), + current_group_size); return true; } @@ -4293,16 +4298,17 @@ Target_aarch64<size, big_endian>::do_relax( gold_assert(!parameters->options().relocatable()); if (pass == 1) { - section_size_type stub_group_size = - parameters->options().stub_group_size(); - if (stub_group_size == 1) + // We don't handle negative stub_group_size right now. + this->stub_group_size_ = abs(parameters->options().stub_group_size()); + if (this->stub_group_size_ == 1) { // Leave room for 4096 4-byte stub entries. If we exceed that, then we // will fail to link. The user will have to relink with an explicit // group size option. - stub_group_size = The_reloc_stub::MAX_BRANCH_OFFSET - 4096 * 4; + this->stub_group_size_ = The_reloc_stub::MAX_BRANCH_OFFSET - + 4096 * 4; } - group_sections(layout, stub_group_size, true, task); + group_sections(layout, this->stub_group_size_, true, task); } else { @@ -5739,7 +5745,8 @@ Target_aarch64<size, big_endian>::Relocate::relocate( // Fallthrough case elfcpp::R_AARCH64_JUMP26: if (Reloc::maybe_apply_stub(r_type, relinfo, rela, view, address, - gsym, psymval, object)) + gsym, psymval, object, + target->stub_group_size_)) break; // Fallthrough case elfcpp::R_AARCH64_TSTBR14: |