* layout.cc (Layout::layout_gnu_stack): Add warnings for executable

stack.
	* layout.h (Layout::layout_gnu_stack): Add pointer to Object
	parameter; change all callers.
	* object.cc (Sized_relobj::do_layout): Adjust call to layout_gnu_stack.
	* options.h (warn_execstack): New option.
This commit is contained in:
Cary Coutant 2010-12-09 23:19:50 +00:00
parent f9bbfb18be
commit 83e17bd5ed
5 changed files with 33 additions and 5 deletions

View File

@ -1,3 +1,12 @@
2010-12-09 Cary Coutant <ccoutant@google.com>
* layout.cc (Layout::layout_gnu_stack): Add warnings for executable
stack.
* layout.h (Layout::layout_gnu_stack): Add pointer to Object
parameter; change all callers.
* object.cc (Sized_relobj::do_layout): Adjust call to layout_gnu_stack.
* options.h (warn_execstack): New option.
2010-12-07 Doug Kwan <dougkwan@google.com>
* arm.cc (Target_arm::Scan::get_reference_flags): Treat R_ARM_PREL31

View File

@ -1344,15 +1344,29 @@ Layout::expected_segment_count() const
// object. On some targets that will force an executable stack.
void
Layout::layout_gnu_stack(bool seen_gnu_stack, uint64_t gnu_stack_flags)
Layout::layout_gnu_stack(bool seen_gnu_stack, uint64_t gnu_stack_flags,
const Object* obj)
{
if (!seen_gnu_stack)
this->input_without_gnu_stack_note_ = true;
{
this->input_without_gnu_stack_note_ = true;
if (parameters->options().warn_execstack()
&& parameters->target().is_default_stack_executable())
gold_warning(_("%s: missing .note.GNU-stack section"
" implies executable stack"),
obj->name().c_str());
}
else
{
this->input_with_gnu_stack_note_ = true;
if ((gnu_stack_flags & elfcpp::SHF_EXECINSTR) != 0)
this->input_requires_executable_stack_ = true;
{
this->input_requires_executable_stack_ = true;
if (parameters->options().warn_execstack()
|| parameters->options().is_stack_executable())
gold_warning(_("%s: requires executable stack"),
obj->name().c_str());
}
}
}

View File

@ -470,7 +470,8 @@ class Layout
// .note.GNU-stack section. GNU_STACK_FLAGS is the section flags
// from that section if there was one.
void
layout_gnu_stack(bool seen_gnu_stack, uint64_t gnu_stack_flags);
layout_gnu_stack(bool seen_gnu_stack, uint64_t gnu_stack_flags,
const Object*);
// Add an Output_section_data to the layout. This is used for
// special sections like the GOT section. ORDER is where the

View File

@ -1429,7 +1429,7 @@ Sized_relobj<size, big_endian>::do_layout(Symbol_table* symtab,
}
if (!is_gc_pass_two)
layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags);
layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags, this);
// When doing a relocatable link handle the reloc sections at the
// end. Garbage collection and Identical Code Folding is not

View File

@ -1035,6 +1035,10 @@ class General_options
DEFINE_bool(warn_constructors, options::TWO_DASHES, '\0', false,
N_("Ignored"), N_("Ignored"));
DEFINE_bool(warn_execstack, options::TWO_DASHES, '\0', false,
N_("Warn if the stack is executable"),
N_("Do not warn if the stack is executable (default)"));
DEFINE_bool(warn_mismatch, options::TWO_DASHES, '\0', true,
NULL, N_("Don't warn about mismatched input files"));