diff options
author | Ian Lance Taylor <ian@airs.com> | 2008-04-09 00:26:48 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2008-04-09 00:26:48 +0000 |
commit | 2c38906f72b07a9e3b8386d9de8a61b33db04d99 (patch) | |
tree | 2a6adbbd5b22a4cc9eeffb02b04d65b4c3e066b1 /gold | |
parent | c9825dba58c3e58303a5a09d368275dd220b7c48 (diff) | |
download | gdb-2c38906f72b07a9e3b8386d9de8a61b33db04d99.zip gdb-2c38906f72b07a9e3b8386d9de8a61b33db04d99.tar.gz gdb-2c38906f72b07a9e3b8386d9de8a61b33db04d99.tar.bz2 |
* layout.h (class Layout): Add added_eh_frame_data_ field.
* layout.cc (Layout::Layout): Initialize new field.
(Layout::layout_eh_frame): Don't add eh_frame_data_ to .eh_frame
output section until we find a section we merged successfully.
* object.cc (Sized_relobj::check_eh_frame_flags): Don't require
that the size be non-zero.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 7 | ||||
-rw-r--r-- | gold/layout.cc | 18 | ||||
-rw-r--r-- | gold/layout.h | 2 | ||||
-rw-r--r-- | gold/object.cc | 3 |
4 files changed, 25 insertions, 5 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 6a8ac98..78ff07e 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,12 @@ 2008-04-08 Ian Lance Taylor <iant@google.com> + * layout.h (class Layout): Add added_eh_frame_data_ field. + * layout.cc (Layout::Layout): Initialize new field. + (Layout::layout_eh_frame): Don't add eh_frame_data_ to .eh_frame + output section until we find a section we merged successfully. + * object.cc (Sized_relobj::check_eh_frame_flags): Don't require + that the size be non-zero. + * merge.cc (Object_merge_map::get_output_offset): Remove inline qualifier. diff --git a/gold/layout.cc b/gold/layout.cc index e8582ca..efeaf65 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -82,7 +82,8 @@ Layout::Layout(const General_options& options, Script_options* script_options) unattached_section_list_(), special_output_list_(), section_headers_(NULL), tls_segment_(NULL), symtab_section_(NULL), dynsym_section_(NULL), dynamic_section_(NULL), dynamic_data_(NULL), - eh_frame_section_(NULL), eh_frame_data_(NULL), eh_frame_hdr_section_(NULL), + eh_frame_section_(NULL), eh_frame_data_(NULL), + added_eh_frame_data_(false), eh_frame_hdr_section_(NULL), build_id_note_(NULL), group_signatures_(), output_file_size_(-1), input_requires_executable_stack_(false), input_with_gnu_stack_note_(false), @@ -563,7 +564,6 @@ Layout::layout_eh_frame(Sized_relobj<size, big_endian>* object, { this->eh_frame_section_ = os; this->eh_frame_data_ = new Eh_frame(); - os->add_output_section_data(this->eh_frame_data_); if (this->options_.eh_frame_hdr()) { @@ -605,7 +605,19 @@ Layout::layout_eh_frame(Sized_relobj<size, big_endian>* object, shndx, reloc_shndx, reloc_type)) - *off = -1; + { + // We found a .eh_frame section we are going to optimize, so now + // we can add the set of optimized sections to the output + // section. We need to postpone adding this until we've found a + // section we can optimize so that the .eh_frame section in + // crtbegin.o winds up at the start of the output section. + if (!this->added_eh_frame_data_) + { + os->add_output_section_data(this->eh_frame_data_); + this->added_eh_frame_data_ = true; + } + *off = -1; + } else { // We couldn't handle this .eh_frame section for some reason. diff --git a/gold/layout.h b/gold/layout.h index fe888c7..edf6438 100644 --- a/gold/layout.h +++ b/gold/layout.h @@ -597,6 +597,8 @@ class Layout Output_section* eh_frame_section_; // The exception frame data for eh_frame_section_. Eh_frame* eh_frame_data_; + // Whether we have added eh_frame_data_ to the .eh_frame section. + bool added_eh_frame_data_; // The exception frame header output section if there is one. Output_section* eh_frame_hdr_section_; // The space for the build ID checksum if there is one. diff --git a/gold/object.cc b/gold/object.cc index c1ddae4..36d3dcc 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -226,8 +226,7 @@ bool Sized_relobj<size, big_endian>::check_eh_frame_flags( const elfcpp::Shdr<size, big_endian>* shdr) const { - return (shdr->get_sh_size() > 0 - && shdr->get_sh_type() == elfcpp::SHT_PROGBITS + return (shdr->get_sh_type() == elfcpp::SHT_PROGBITS && (shdr->get_sh_flags() & elfcpp::SHF_ALLOC) != 0); } |