aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2008-07-22 23:55:24 +0000
committerIan Lance Taylor <ian@airs.com>2008-07-22 23:55:24 +0000
commit3481085102449795e77ce56d628a10e931bde4be (patch)
treef6510cf30a08cd3a890974e609b85960ce03ac24 /gold
parentaf6156ef8ded31c7b8e19fa7995e4de14a5b9639 (diff)
downloadgdb-3481085102449795e77ce56d628a10e931bde4be.zip
gdb-3481085102449795e77ce56d628a10e931bde4be.tar.gz
gdb-3481085102449795e77ce56d628a10e931bde4be.tar.bz2
* options.h (class General_options): Define --check-sections.
* layout.cc (Layout::set_segment_offsets): Handle --check-sections.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog4
-rw-r--r--gold/layout.cc22
-rw-r--r--gold/options.h4
3 files changed, 30 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 372c8d9..6fb10a1 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,9 @@
2008-07-22 Ian Lance Taylor <iant@google.com>
+ * options.h (class General_options): Define --check-sections.
+ * layout.cc (Layout::set_segment_offsets): Handle
+ --check-sections.
+
* options.h (class General_options): Define -n/--nmagic and
-N/--omagic.
* options.cc (General_options::finalize): For -n/--nmagic or
diff --git a/gold/layout.cc b/gold/layout.cc
index 8c7cd99..37edbb6c 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -1732,6 +1732,9 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
}
}
+ const bool check_sections = parameters->options().check_sections();
+ Output_segment* last_load_segment = NULL;
+
bool was_readonly = false;
for (Segment_list::iterator p = this->segment_list_.begin();
p != this->segment_list_.end();
@@ -1848,6 +1851,25 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
if (((*p)->flags() & elfcpp::PF_W) == 0)
was_readonly = true;
+
+ // Implement --check-sections. We know that the segments
+ // are sorted by LMA.
+ if (check_sections && last_load_segment != NULL)
+ {
+ gold_assert(last_load_segment->paddr() <= (*p)->paddr());
+ if (last_load_segment->paddr() + last_load_segment->memsz()
+ > (*p)->paddr())
+ {
+ unsigned long long lb1 = last_load_segment->paddr();
+ unsigned long long le1 = lb1 + last_load_segment->memsz();
+ unsigned long long lb2 = (*p)->paddr();
+ unsigned long long le2 = lb2 + (*p)->memsz();
+ gold_error(_("load segment overlap [0x%llx -> 0x%llx] and "
+ "[0x%llx -> 0x%llx]"),
+ lb1, le1, lb2, le2);
+ }
+ }
+ last_load_segment = *p;
}
}
diff --git a/gold/options.h b/gold/options.h
index 91f9552..6a456f1 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -576,6 +576,10 @@ class General_options
N_("Generate build ID note"),
N_("[=STYLE]"));
+ DEFINE_bool(check_sections, options::TWO_DASHES, '\0', true,
+ N_("Check segment addresses for overlaps (default)"),
+ N_("Do not check segment addresses for overlaps"));
+
#ifdef HAVE_ZLIB_H
DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
N_("Compress .debug_* sections in the output file"),