diff options
author | Jakub Jelinek <jakub@redhat.com> | 2003-06-03 22:27:24 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2003-06-03 22:27:24 +0000 |
commit | 9ee5e4996f81ebf9c9febba19df86d9072313343 (patch) | |
tree | 7f938d499771d165d2820e2ad589d1c7844c2990 /bfd/elflink.h | |
parent | 65982ba6e7c672622ff83141c1c7f563f0427132 (diff) | |
download | gdb-9ee5e4996f81ebf9c9febba19df86d9072313343.zip gdb-9ee5e4996f81ebf9c9febba19df86d9072313343.tar.gz gdb-9ee5e4996f81ebf9c9febba19df86d9072313343.tar.bz2 |
binutils/
* readelf.c (get_segment_type): Handle PT_GNU_STACK.
bfd/
* elf.c (_bfd_elf_print_private_bfd_data): Handle PT_GNU_STACK.
(bfd_section_from_phdr): Likewise.
(map_sections_to_segments): Create PT_GNU_STACK segment header.
(get_program_header_size): Count with PT_GNU_STACK.
* elf-bfd.h (struct elf_obj_tdata): Add stack_flags.
* elflink.h (bfd_elfNN_size_dynamic_sections): Set stack_flags.
include/
* bfdlink.h (struct bfd_link_info): Add execstack and noexecstack.
* elf/common.h (PT_GNU_STACK): Define.
ld/
* ldgram.y (phdr_type): Grok PT_GNU_STACK.
* emultempl/elf32.em (gld${EMULATION_NAME}_handle_option): Add
-z execstack and -z noexecstack.
(gld${EMULATION_NAME}_list_options): Likewise.
* scripttempl/elf.sc: If not -r, discard .note.GNU-stack section.
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r-- | bfd/elflink.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/bfd/elflink.h b/bfd/elflink.h index a7ef742..8acb7a9 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -1937,6 +1937,43 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, if (! is_elf_hash_table (info)) return TRUE; + if (info->execstack) + elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X; + else if (info->noexecstack) + elf_tdata (output_bfd)->stack_flags = PF_R | PF_W; + else + { + bfd *inputobj; + asection *notesec = NULL; + int exec = 0; + + for (inputobj = info->input_bfds; + inputobj; + inputobj = inputobj->link_next) + { + asection *s; + + if (inputobj->flags & DYNAMIC) + continue; + s = bfd_get_section_by_name (inputobj, ".note.GNU-stack"); + if (s) + { + if (s->flags & SEC_CODE) + exec = PF_X; + notesec = s; + } + else + exec = PF_X; + } + if (notesec) + { + elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | exec; + if (exec && info->relocateable + && notesec->output_section != bfd_abs_section_ptr) + notesec->output_section->flags |= SEC_CODE; + } + } + /* Any syms created from now on start with -1 in got.refcount/offset and plt.refcount/offset. */ elf_hash_table (info)->init_refcount = elf_hash_table (info)->init_offset; |