aboutsummaryrefslogtreecommitdiff
path: root/gold/layout.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2010-12-09 23:19:50 +0000
committerCary Coutant <ccoutant@google.com>2010-12-09 23:19:50 +0000
commit83e17bd5ed3c2586f558202172bf9f52ac80650c (patch)
tree3e1249454b28872800852006958bd7e5e27c2705 /gold/layout.cc
parentf9bbfb18bec91f344bcc74343ad77c8a0e49ed4e (diff)
downloadgdb-83e17bd5ed3c2586f558202172bf9f52ac80650c.zip
gdb-83e17bd5ed3c2586f558202172bf9f52ac80650c.tar.gz
gdb-83e17bd5ed3c2586f558202172bf9f52ac80650c.tar.bz2
* 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.
Diffstat (limited to 'gold/layout.cc')
-rw-r--r--gold/layout.cc20
1 files changed, 17 insertions, 3 deletions
diff --git a/gold/layout.cc b/gold/layout.cc
index 52120cc..9bf9a9f 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -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());
+ }
}
}