diff options
author | Alan Modra <amodra@gmail.com> | 2016-12-13 09:30:06 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-12-13 09:37:59 +1030 |
commit | 22b05d33b4c870d65972ff8aefdd297ddc66d139 (patch) | |
tree | 2d8a77b9ee451188f674ed380f0d228393233267 /bfd | |
parent | 6392030005291f7c783da2247b63ae31dc8352e0 (diff) | |
download | fsf-binutils-gdb-22b05d33b4c870d65972ff8aefdd297ddc66d139.zip fsf-binutils-gdb-22b05d33b4c870d65972ff8aefdd297ddc66d139.tar.gz fsf-binutils-gdb-22b05d33b4c870d65972ff8aefdd297ddc66d139.tar.bz2 |
Don't add PHDR for objcopy/strip or ld script specifying PHDRS
HPPA64 needs to add a DT_PHDR header for shared libs. That's fine
when linking but shouldn't happen for strip/objcopy. Also PHDR must
come first so there's no need to look at all program headers.
bfd/
* elf64-hppa.c (elf64_hppa_modify_segment_map): Don't add PHDR
for objcopy/strip or when a ld script specifies PHDRS.
ld/
* testsuite/ld-elf/nobits-1.d: Remove xfail for hppa64.
* testsuite/ld-elf/note-1.d: Likewise.
* testsuite/ld-elf/note-2.d: Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf64-hppa.c | 37 |
2 files changed, 19 insertions, 23 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b461ebe..26d4084 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2016-12-13 Alan Modra <amodra@gmail.com> + * elf64-hppa.c (elf64_hppa_modify_segment_map): Don't add PHDR + for objcopy/strip or when a ld script specifies PHDRS. + +2016-12-13 Alan Modra <amodra@gmail.com> + * elf32-rx.c (elf32_rx_modify_program_headers): Don't adjust segments that include the ELF file header or program headers. diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c index 0e19f0a..46190db 100644 --- a/bfd/elf64-hppa.c +++ b/bfd/elf64-hppa.c @@ -2688,38 +2688,29 @@ elf64_hppa_allow_non_load_phdr (bfd *abfd ATTRIBUTE_UNUSED, existence of a .interp section. */ static bfd_boolean -elf64_hppa_modify_segment_map (bfd *abfd, - struct bfd_link_info *info ATTRIBUTE_UNUSED) +elf64_hppa_modify_segment_map (bfd *abfd, struct bfd_link_info *info) { struct elf_segment_map *m; - asection *s; - s = bfd_get_section_by_name (abfd, ".interp"); - if (! s) + m = elf_seg_map (abfd); + if (info != NULL && !info->user_phdrs && m != NULL && m->p_type != PT_PHDR) { - for (m = elf_seg_map (abfd); m != NULL; m = m->next) - if (m->p_type == PT_PHDR) - break; - + m = ((struct elf_segment_map *) + bfd_zalloc (abfd, (bfd_size_type) sizeof *m)); if (m == NULL) - { - m = ((struct elf_segment_map *) - bfd_zalloc (abfd, (bfd_size_type) sizeof *m)); - if (m == NULL) - return FALSE; + return FALSE; - m->p_type = PT_PHDR; - m->p_flags = PF_R | PF_X; - m->p_flags_valid = 1; - m->p_paddr_valid = 1; - m->includes_phdrs = 1; + m->p_type = PT_PHDR; + m->p_flags = PF_R | PF_X; + m->p_flags_valid = 1; + m->p_paddr_valid = 1; + m->includes_phdrs = 1; - m->next = elf_seg_map (abfd); - elf_seg_map (abfd) = m; - } + m->next = elf_seg_map (abfd); + elf_seg_map (abfd) = m; } - for (m = elf_seg_map (abfd); m != NULL; m = m->next) + for (m = elf_seg_map (abfd) ; m != NULL; m = m->next) if (m->p_type == PT_LOAD) { unsigned int i; |