diff options
author | Nick Clifton <nickc@redhat.com> | 2019-02-18 15:08:57 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2019-02-18 15:08:57 +0000 |
commit | 88739f776b733b0b84600b283417f862a010bb5d (patch) | |
tree | 6da6a1752da4d524d55c8f0f982ef047bd1a0a75 /gold | |
parent | 292144de4f26e2c6a1fa9d84da2c7758872d4725 (diff) | |
download | gdb-88739f776b733b0b84600b283417f862a010bb5d.zip gdb-88739f776b733b0b84600b283417f862a010bb5d.tar.gz gdb-88739f776b733b0b84600b283417f862a010bb5d.tar.bz2 |
Import patch to fix PR23919 from the mainline.
PR binutils/23919
bfd * bfd.c (bfd_update_compression_header): Explicitly set alignment.
(bfd_check_compression_header): Add uncompressed_alignment_power
argument. Check ch_addralign is a power of 2.
* bfd-in2.h: Regenerated.
* compress.c (bfd_compress_section_contents): Get and set
orig_uncompressed_alignment_pow if section is decompressed.
(bfd_is_section_compressed_with_header): Add and get
uncompressed_align_pow_p argument.
(bfd_is_section_compressed): Add uncompressed_align_power argument
to bfd_is_section_compressed_with_header call.
(bfd_init_section_decompress_status): Get and set
uncompressed_alignment_power.
* elf.c (_bfd_elf_make_section_from_shdr): Add
uncompressed_align_power argument to
bfd_is_section_compressed_with_header call.
* compress.c (bfd_is_section_compressed_with_header): Initialize
* uncompressed_align_pow_p to 0.
binutils* readelf.c (dump_sections_as_strings): Remove bogus addralign check.
(dump_sections_as_bytes): Likewise.
(load_specific_debug_sections): Likewise.
* testsuite/binutils-all/dw2-3.rS: Adjust alignment.
* testsuite/binutils-all/dw2-3.rt: Likewise.
gold * merge.cc (Output_merge_string<Char_type>::do_add_input_section):
Get addralign from decompressed_section_contents.
* object.cc (build_compressed_section_map): Set info.addralign.
(Object::decompressed_section_contents): Add a palign
argument and store p->second.addralign in *palign if it isn't
NULL.
* object.h (Compressed_section_info): Add addralign.
(section_is_compressed): Add a palign argument, default it
to NULL, store p->second.addralign in *palign if it isn't NULL.
(Object::decompressed_section_contents): Likewise.
* output.cc (Output_section::add_input_section): Get addralign
from section_is_compressed.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 19 | ||||
-rw-r--r-- | gold/merge.cc | 8 | ||||
-rw-r--r-- | gold/object.cc | 11 | ||||
-rw-r--r-- | gold/object.h | 8 | ||||
-rw-r--r-- | gold/output.cc | 12 |
5 files changed, 46 insertions, 12 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index cf998d9..10ebc76 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,22 @@ +2019-02-18 Nick Clifton <nickc@redhat.com> + + Import from the mainline: + 2018-12-02 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/23919 + * merge.cc (Output_merge_string<Char_type>::do_add_input_section): + Get addralign from decompressed_section_contents. + * object.cc (build_compressed_section_map): Set info.addralign. + (Object::decompressed_section_contents): Add a palign + argument and store p->second.addralign in *palign if it isn't + NULL. + * object.h (Compressed_section_info): Add addralign. + (section_is_compressed): Add a palign argument, default it + to NULL, store p->second.addralign in *palign if it isn't NULL. + (Object::decompressed_section_contents): Likewise. + * output.cc (Output_section::add_input_section): Get addralign + from section_is_compressed. + 2018-08-06 Cary Coutant <ccoutant@gmail.com> PR gold/23455 diff --git a/gold/merge.cc b/gold/merge.cc index de00ee9..d7de117 100644 --- a/gold/merge.cc +++ b/gold/merge.cc @@ -440,9 +440,11 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, { section_size_type sec_len; bool is_new; + uint64_t addralign = this->addralign(); const unsigned char* pdata = object->decompressed_section_contents(shndx, &sec_len, - &is_new); + &is_new, + &addralign); const Char_type* p = reinterpret_cast<const Char_type*>(pdata); const Char_type* pend = p + sec_len / sizeof(Char_type); @@ -494,7 +496,7 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, // aligned, so each string within the section must retain the same // modulo. uintptr_t init_align_modulo = (reinterpret_cast<uintptr_t>(pdata) - & (this->addralign() - 1)); + & (addralign - 1)); bool has_misaligned_strings = false; while (p < pend) @@ -503,7 +505,7 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, // Within merge input section each string must be aligned. if (len != 0 - && ((reinterpret_cast<uintptr_t>(p) & (this->addralign() - 1)) + && ((reinterpret_cast<uintptr_t>(p) & (addralign - 1)) != init_align_modulo)) has_misaligned_strings = true; diff --git a/gold/object.cc b/gold/object.cc index 374340f..711793e 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -751,11 +751,13 @@ build_compressed_section_map( const unsigned char* contents = obj->section_contents(i, &len, false); uint64_t uncompressed_size; + Compressed_section_info info; if (is_zcompressed) { // Skip over the ".zdebug" prefix. name += 7; uncompressed_size = get_uncompressed_size(contents, len); + info.addralign = shdr.get_sh_addralign(); } else { @@ -763,8 +765,8 @@ build_compressed_section_map( name += 6; elfcpp::Chdr<size, big_endian> chdr(contents); uncompressed_size = chdr.get_ch_size(); + info.addralign = chdr.get_ch_addralign(); } - Compressed_section_info info; info.size = convert_to_section_size_type(uncompressed_size); info.flag = shdr.get_sh_flags(); info.contents = NULL; @@ -3060,7 +3062,8 @@ const unsigned char* Object::decompressed_section_contents( unsigned int shndx, section_size_type* plen, - bool* is_new) + bool* is_new, + uint64_t* palign) { section_size_type buffer_size; const unsigned char* buffer = this->do_section_contents(shndx, &buffer_size, @@ -3087,6 +3090,8 @@ Object::decompressed_section_contents( { *plen = uncompressed_size; *is_new = false; + if (palign != NULL) + *palign = p->second.addralign; return p->second.contents; } @@ -3108,6 +3113,8 @@ Object::decompressed_section_contents( // once in this pass. *plen = uncompressed_size; *is_new = true; + if (palign != NULL) + *palign = p->second.addralign; return uncompressed_data; } diff --git a/gold/object.h b/gold/object.h index 0b786a5..b995484 100644 --- a/gold/object.h +++ b/gold/object.h @@ -373,6 +373,7 @@ struct Compressed_section_info { section_size_type size; elfcpp::Elf_Xword flag; + uint64_t addralign; const unsigned char* contents; }; typedef std::map<unsigned int, Compressed_section_info> Compressed_section_map; @@ -808,7 +809,8 @@ class Object bool section_is_compressed(unsigned int shndx, - section_size_type* uncompressed_size) const + section_size_type* uncompressed_size, + elfcpp::Elf_Xword* palign = NULL) const { if (this->compressed_sections_ == NULL) return false; @@ -818,6 +820,8 @@ class Object { if (uncompressed_size != NULL) *uncompressed_size = p->second.size; + if (palign != NULL) + *palign = p->second.addralign; return true; } return false; @@ -828,7 +832,7 @@ class Object // by the caller. const unsigned char* decompressed_section_contents(unsigned int shndx, section_size_type* plen, - bool* is_cached); + bool* is_cached, uint64_t* palign = NULL); // Discard any buffers of decompressed sections. This is done // at the end of the Add_symbols task. diff --git a/gold/output.cc b/gold/output.cc index 1701db1..51836db 100644 --- a/gold/output.cc +++ b/gold/output.cc @@ -2448,7 +2448,14 @@ Output_section::add_input_section(Layout* layout, unsigned int reloc_shndx, bool have_sections_script) { + section_size_type input_section_size = shdr.get_sh_size(); + section_size_type uncompressed_size; elfcpp::Elf_Xword addralign = shdr.get_sh_addralign(); + + if (object->section_is_compressed(shndx, &uncompressed_size, + &addralign)) + input_section_size = uncompressed_size; + if ((addralign & (addralign - 1)) != 0) { object->error(_("invalid alignment %lu for section \"%s\""), @@ -2498,11 +2505,6 @@ Output_section::add_input_section(Layout* layout, } } - section_size_type input_section_size = shdr.get_sh_size(); - section_size_type uncompressed_size; - if (object->section_is_compressed(shndx, &uncompressed_size)) - input_section_size = uncompressed_size; - off_t offset_in_section; if (this->has_fixed_layout()) |