* options.h (class General_options): Define --check-sections.
* layout.cc (Layout::set_segment_offsets): Handle --check-sections.
This commit is contained in:
parent
af6156ef8d
commit
3481085102
@ -1,5 +1,9 @@
|
|||||||
2008-07-22 Ian Lance Taylor <iant@google.com>
|
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
|
* options.h (class General_options): Define -n/--nmagic and
|
||||||
-N/--omagic.
|
-N/--omagic.
|
||||||
* options.cc (General_options::finalize): For -n/--nmagic or
|
* options.cc (General_options::finalize): For -n/--nmagic or
|
||||||
|
@ -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;
|
bool was_readonly = false;
|
||||||
for (Segment_list::iterator p = this->segment_list_.begin();
|
for (Segment_list::iterator p = this->segment_list_.begin();
|
||||||
p != this->segment_list_.end();
|
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)
|
if (((*p)->flags() & elfcpp::PF_W) == 0)
|
||||||
was_readonly = true;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,6 +576,10 @@ class General_options
|
|||||||
N_("Generate build ID note"),
|
N_("Generate build ID note"),
|
||||||
N_("[=STYLE]"));
|
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
|
#ifdef HAVE_ZLIB_H
|
||||||
DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
|
DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
|
||||||
N_("Compress .debug_* sections in the output file"),
|
N_("Compress .debug_* sections in the output file"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user