X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gold%2Flayout.cc;h=a27cb071c75d8537800b096287d23eda6cd8a2e0;hb=9d4fc61d41a0aef2d199e2b18d238603a8e4be98;hp=8563f110995bd1246d641f4d08db08ea453a36e9;hpb=6bf4a34047452f882c5cc66bd85812ee1bb5a41c;p=binutils-gdb.git diff --git a/gold/layout.cc b/gold/layout.cc index 8563f110995..a27cb071c75 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -1,6 +1,6 @@ // layout.cc -- lay out output file sections for gold -// Copyright (C) 2006-2020 Free Software Foundation, Inc. +// Copyright (C) 2006-2021 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -1099,7 +1099,8 @@ Layout::init_fixed_output_section(const char* name, typename elfcpp::Elf_types::Elf_Addr sh_addr = shdr.get_sh_addr(); typename elfcpp::Elf_types::Elf_Off sh_offset = shdr.get_sh_offset(); typename elfcpp::Elf_types::Elf_WXword sh_size = shdr.get_sh_size(); - typename elfcpp::Elf_types::Elf_WXword sh_flags = shdr.get_sh_flags(); + typename elfcpp::Elf_types::Elf_WXword sh_flags = + this->get_output_section_flags(shdr.get_sh_flags()); typename elfcpp::Elf_types::Elf_WXword sh_addralign = shdr.get_sh_addralign(); @@ -1172,14 +1173,20 @@ Layout::layout(Sized_relobj_file* object, unsigned int shndx, { // Some flags in the input section should not be automatically // copied to the output section. - elfcpp::Elf_Xword flags = (shdr.get_sh_flags() - & ~ elfcpp::SHF_COMPRESSED); + elfcpp::Elf_Xword sh_flags = (shdr.get_sh_flags() + & ~ elfcpp::SHF_COMPRESSED); name = this->namepool_.add(name, true, NULL); - os = this->make_output_section(name, sh_type, flags, - ORDER_INVALID, false); + os = this->make_output_section(name, sh_type, sh_flags, ORDER_INVALID, + false); } else { + // Get the section flags and mask out any flags that do not + // take part in section matching. + elfcpp::Elf_Xword sh_flags + = (this->get_output_section_flags(shdr.get_sh_flags()) + & ~object->osabi().ignored_sh_flags()); + // All ".text.unlikely.*" sections can be moved to a unique // segment with --text-unlikely-segment option. bool text_unlikely_segment @@ -1188,13 +1195,10 @@ Layout::layout(Sized_relobj_file* object, unsigned int shndx, object->section_name(shndx).c_str())); if (text_unlikely_segment) { - elfcpp::Elf_Xword flags - = this->get_output_section_flags(shdr.get_sh_flags()); - Stringpool::Key name_key; const char* os_name = this->namepool_.add(".text.unlikely", true, &name_key); - os = this->get_output_section(os_name, name_key, sh_type, flags, + os = this->get_output_section(os_name, name_key, sh_type, sh_flags, ORDER_INVALID, false); // Map this output section to a unique segment. This is done to // separate "text" that is not likely to be executed from "text" @@ -1212,22 +1216,18 @@ Layout::layout(Sized_relobj_file* object, unsigned int shndx, if (it == this->section_segment_map_.end()) { os = this->choose_output_section(object, name, sh_type, - shdr.get_sh_flags(), true, - ORDER_INVALID, false, false, - true); + sh_flags, true, ORDER_INVALID, + false, false, true); } else { // We know the name of the output section, directly call // get_output_section here by-passing choose_output_section. - elfcpp::Elf_Xword flags - = this->get_output_section_flags(shdr.get_sh_flags()); - const char* os_name = it->second->name; Stringpool::Key name_key; os_name = this->namepool_.add(os_name, true, &name_key); - os = this->get_output_section(os_name, name_key, sh_type, flags, - ORDER_INVALID, false); + os = this->get_output_section(os_name, name_key, sh_type, + sh_flags, ORDER_INVALID, false); if (!os->is_unique_segment()) { os->set_is_unique_segment(); @@ -5371,6 +5371,12 @@ Layout::finish_dynamic_section(const Input_objects* input_objects, flags |= elfcpp::DF_1_PIE; if (flags != 0) odyn->add_constant(elfcpp::DT_FLAGS_1, flags); + + flags = 0; + if (parameters->options().unique()) + flags |= elfcpp::DF_GNU_1_UNIQUE; + if (flags != 0) + odyn->add_constant(elfcpp::DT_GNU_FLAGS_1, flags); } // Set the size of the _DYNAMIC symbol table to be the size of the