* 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.
This commit is contained in:
parent
92de84a60c
commit
af6156ef8d
|
@ -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.
|
||||
|
|
|
@ -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)));
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue