X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fobject.cc;h=c486a2011d5c4d5167272ca83d93cd20f90bbf3d;hb=f3f8ece4b1c77c925d1f1566df0bf632790a4d24;hp=8c874fedc8d5c493b4c455a54e3202f41a97f504;hpb=6c04fd9b2fb4396c0189cb414ce598161ac8673e;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/object.cc b/gold/object.cc index 8c874fedc8..c486a2011d 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -1,6 +1,6 @@ // object.cc -- support for an object file for linking in gold -// Copyright (C) 2006-2018 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -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 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; @@ -1378,6 +1380,18 @@ Sized_relobj_file::layout_gnu_property_section( } } +// This a copy of lto_section defined in GCC (lto-streamer.h) + +struct lto_section +{ + int16_t major_version; + int16_t minor_version; + unsigned char slim_object; + + /* Flags is a private field that is not defined publicly. */ + uint16_t flags; +}; + // Lay out the input sections. We walk through the sections and check // whether they should be included in the link. If they should, we // pass them to the Layout object, which will return an output section @@ -1742,9 +1756,13 @@ Sized_relobj_file::do_layout(Symbol_table* symtab, out_section_offsets[i] = invalid_address; } else if (this->is_deferred_layout()) - this->deferred_layout_.push_back( - Deferred_layout(i, name, sh_type, pshdrs, - reloc_shndx[i], reloc_type[i])); + { + out_sections[i] = reinterpret_cast(2); + out_section_offsets[i] = invalid_address; + this->deferred_layout_.push_back( + Deferred_layout(i, name, sh_type, pshdrs, + reloc_shndx[i], reloc_type[i])); + } else eh_frame_sections.push_back(i); continue; @@ -1859,10 +1877,30 @@ Sized_relobj_file::do_layout(Symbol_table* symtab, debug_types_sections.push_back(i); } } + + /* GCC uses .gnu.lto_.lto. as a LTO bytecode information + section. */ + const char *lto_section_name = ".gnu.lto_.lto."; + if (strncmp (name, lto_section_name, strlen (lto_section_name)) == 0) + { + section_size_type contents_len; + const unsigned char* pcontents + = this->section_contents(i, &contents_len, false); + if (contents_len >= sizeof(lto_section)) + { + const lto_section* lsection + = reinterpret_cast(pcontents); + if (lsection->slim_object) + layout->set_lto_slim_object(); + } + } } if (!is_pass_two) - layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags, this); + { + layout->merge_gnu_properties(this); + layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags, this); + } // Handle the .eh_frame sections after the other sections. gold_assert(!is_pass_one || eh_frame_sections.empty()); @@ -2074,7 +2112,7 @@ template void Sized_relobj_file::do_add_symbols(Symbol_table* symtab, Read_symbols_data* sd, - Layout*) + Layout* layout) { if (sd->symbols == NULL) { @@ -2093,6 +2131,11 @@ Sized_relobj_file::do_add_symbols(Symbol_table* symtab, this->symbols_.resize(symcount); + if (!parameters->options().relocatable() + && layout->is_lto_slim_object ()) + gold_info(_("%s: plugin needed to handle lto object"), + this->name().c_str()); + const char* sym_names = reinterpret_cast(sd->symbol_names->data()); symtab->add_from_relobj(this, @@ -2603,6 +2646,10 @@ Sized_relobj_file::do_finalize_local_symbols( lv->set_output_symtab_index(index); ++index; } + if (lv->is_ifunc_symbol() + && (lv->has_output_symtab_entry() + || lv->needs_output_dynsym_entry())) + symtab->set_has_gnu_output(); break; case CFLV_DISCARDED: case CFLV_ERROR: @@ -2944,7 +2991,7 @@ Sized_relobj_file::map_to_kept_section( // Since we're using this mapping for relocation processing, // we don't want to match sections unless they have the same // size. - uint64_t kept_size; + uint64_t kept_size = 0; if (kept_section->find_comdat_section(section_name, &kept_shndx, &kept_size)) { @@ -2954,7 +3001,7 @@ Sized_relobj_file::map_to_kept_section( } else { - uint64_t kept_size; + uint64_t kept_size = 0; if (kept_section->find_single_comdat_section(&kept_shndx, &kept_size) && sh_size == kept_size) @@ -3057,7 +3104,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, @@ -3084,6 +3132,8 @@ Object::decompressed_section_contents( { *plen = uncompressed_size; *is_new = false; + if (palign != NULL) + *palign = p->second.addralign; return p->second.contents; } @@ -3105,6 +3155,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; }