summaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2008-07-22 23:01:20 +0000
committerIan Lance Taylor <ian@airs.com>2008-07-22 23:01:20 +0000
commitaf6156ef8ded31c7b8e19fa7995e4de14a5b9639 (patch)
treeb6f76e21579975faa46d823307fa81ae589c5b0d /gold
parent92de84a60cbdb80b808c8571e709c1384c6ee6fc (diff)
downloadbinutils-gdb-af6156ef8ded31c7b8e19fa7995e4de14a5b9639.tar.gz
* 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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog16
-rw-r--r--gold/layout.cc33
-rw-r--r--gold/options.cc4
-rw-r--r--gold/options.h6
-rw-r--r--gold/script-sections.cc3
5 files changed, 48 insertions, 14 deletions
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 <iant@google.com>
+ * 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.