From: Ian Lance Taylor Date: Tue, 22 Jul 2008 23:01:20 +0000 (+0000) Subject: * options.h (class General_options): Define -n/--nmagic and X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=af6156ef8ded31c7b8e19fa7995e4de14a5b9639;p=binutils-gdb.git * options.h (class General_options): Define -n/--nmagic and -N/--omagic. * options.cc (General_options::finalize): For -n/--nmagic or -N/--omagic, set -static. * layout.cc (Layout::attach_allocated_section_to_segment): If -N/--omagic, don't put read-only and read-write sections in different segments. (Layout::find_first_load_seg): If -N/--omagic, don't insist on finding a read-only segment. (Layout::set_segment_offsets): If -N/--omagic or -n/--nmagic, don't set the minimum segment alignment to the common page size, and don't set the file offset to the address modulo the page size. * script-sections.cc (Script_sections::create_segments): If -n/--omagic, don't put read-only and read-write sections in different segments. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index ce2a4e316c8..372c8d9388c 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,21 @@ 2008-07-22 Ian Lance Taylor + * options.h (class General_options): Define -n/--nmagic and + -N/--omagic. + * options.cc (General_options::finalize): For -n/--nmagic or + -N/--omagic, set -static. + * layout.cc (Layout::attach_allocated_section_to_segment): If + -N/--omagic, don't put read-only and read-write sections in + different segments. + (Layout::find_first_load_seg): If -N/--omagic, don't insist on + finding a read-only segment. + (Layout::set_segment_offsets): If -N/--omagic or -n/--nmagic, + don't set the minimum segment alignment to the common page size, + and don't set the file offset to the address modulo the page size. + * script-sections.cc (Script_sections::create_segments): If + -n/--omagic, don't put read-only and read-write sections in + different segments. + * cref.cc: New file. * cref.h: New file. * options.h (class General_options): Add --print-symbol-counts. diff --git a/gold/layout.cc b/gold/layout.cc index 13518d66299..8c7cd9968bb 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -865,7 +865,8 @@ Layout::attach_allocated_section_to_segment(Output_section* os) ++p) { if ((*p)->type() == elfcpp::PT_LOAD - && ((*p)->flags() & elfcpp::PF_W) == (seg_flags & elfcpp::PF_W)) + && (parameters->options().omagic() + || ((*p)->flags() & elfcpp::PF_W) == (seg_flags & elfcpp::PF_W))) { // If -Tbss was specified, we need to separate the data // and BSS segments. @@ -1108,7 +1109,8 @@ Layout::find_first_load_seg() { if ((*p)->type() == elfcpp::PT_LOAD && ((*p)->flags() & elfcpp::PF_R) != 0 - && ((*p)->flags() & elfcpp::PF_W) == 0) + && (parameters->options().omagic() + || ((*p)->flags() & elfcpp::PF_W) == 0)) return *p; } @@ -1769,20 +1771,26 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg, uint64_t aligned_addr = 0; uint64_t abi_pagesize = target->abi_pagesize(); + uint64_t common_pagesize = target->common_pagesize(); - // FIXME: This should depend on the -n and -N options. - (*p)->set_minimum_p_align(target->common_pagesize()); + if (!parameters->options().nmagic() + && !parameters->options().omagic()) + (*p)->set_minimum_p_align(common_pagesize); if (are_addresses_set) { - // Adjust the file offset to the same address modulo the - // page size. - uint64_t unsigned_off = off; - uint64_t aligned_off = ((unsigned_off & ~(abi_pagesize - 1)) - | (addr & (abi_pagesize - 1))); - if (aligned_off < unsigned_off) - aligned_off += abi_pagesize; - off = aligned_off; + if (!parameters->options().nmagic() + && !parameters->options().omagic()) + { + // Adjust the file offset to the same address modulo + // the page size. + uint64_t unsigned_off = off; + uint64_t aligned_off = ((unsigned_off & ~(abi_pagesize - 1)) + | (addr & (abi_pagesize - 1))); + if (aligned_off < unsigned_off) + aligned_off += abi_pagesize; + off = aligned_off; + } } else { @@ -1817,7 +1825,6 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg, if (!are_addresses_set && aligned_addr != addr) { - uint64_t common_pagesize = target->common_pagesize(); uint64_t first_off = (common_pagesize - (aligned_addr & (common_pagesize - 1))); diff --git a/gold/options.cc b/gold/options.cc index 03686e03fd8..9b0cebfadc7 100644 --- a/gold/options.cc +++ b/gold/options.cc @@ -706,6 +706,10 @@ General_options::finalize() this->set_user_set_Map(); } + // Using -n or -N implies -static. + if (this->nmagic() || this->omagic()) + this->set_static(true); + // If --thread_count is specified, it applies to // --thread-count-{initial,middle,final}, though it doesn't override // them. diff --git a/gold/options.h b/gold/options.h index 2641d986ef4..91f9552b92c 100644 --- a/gold/options.h +++ b/gold/options.h @@ -659,6 +659,12 @@ class General_options DEFINE_string(Map, options::ONE_DASH, '\0', NULL, N_("Write map file"), N_("MAPFILENAME")); + DEFINE_bool(nmagic, options::TWO_DASHES, 'n', false, + N_("Do not page align data"), NULL); + DEFINE_bool(omagic, options::EXACTLY_TWO_DASHES, 'N', false, + N_("Do not page align data, do not make text readonly"), + N_("Page align data, make text readonly")); + DEFINE_enable(new_dtags, options::EXACTLY_TWO_DASHES, '\0', false, N_("Enable use of DT_RUNPATH and DT_FLAGS"), N_("Disable use of DT_RUNPATH and DT_FLAGS")); diff --git a/gold/script-sections.cc b/gold/script-sections.cc index 4891ac7d93c..13c97710d29 100644 --- a/gold/script-sections.cc +++ b/gold/script-sections.cc @@ -2657,7 +2657,8 @@ Script_sections::create_segments(Layout* layout) need_new_segment = true; } else if (is_current_seg_readonly - && ((*p)->flags() & elfcpp::SHF_WRITE) != 0) + && ((*p)->flags() & elfcpp::SHF_WRITE) != 0 + && !parameters->options().omagic()) { // Don't put a writable section in the same segment as a // non-writable section.