From 3516e9841caa37f3c19ca09c66ecde8208b7a1d0 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 13 Mar 2009 13:39:57 +0000 Subject: [PATCH] bfd/ 2009-03-13 H.J. Lu PR binutils/9945 * elf.c (assign_section_numbers): Generate symbol table if there is any relocation in output. (_bfd_elf_compute_section_file_positions): Likewise. binutils/ 2009-03-13 H.J. Lu PR binutils/9945 * objcopy.c (copy_object): Clear HAS_RELOC when stripping all. --- bfd/ChangeLog | 7 +++++++ bfd/elf.c | 18 ++++++++++++++---- binutils/ChangeLog | 5 +++++ binutils/objcopy.c | 3 +++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7cbe0a22b17..5bd669d4d9f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2009-03-13 H.J. Lu + + PR binutils/9945 + * elf.c (assign_section_numbers): Generate symbol table if there + is any relocation in output. + (_bfd_elf_compute_section_file_positions): Likewise. + 2009-03-13 Nick Clifton PR 9934 diff --git a/bfd/elf.c b/bfd/elf.c index 97ac5cbc42d..8ca5ef9a62e 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -2774,6 +2774,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info) unsigned int section_number, secn; Elf_Internal_Shdr **i_shdrp; struct bfd_elf_section_data *d; + bfd_boolean need_symtab; section_number = 1; @@ -2829,7 +2830,11 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info) _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name); elf_elfheader (abfd)->e_shstrndx = t->shstrtab_section; - if (bfd_get_symcount (abfd) > 0) + need_symtab = (bfd_get_symcount (abfd) > 0 + || (link_info == NULL + && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC)) + == HAS_RELOC))); + if (need_symtab) { t->symtab_section = section_number++; _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name); @@ -2868,7 +2873,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info) elf_elfsections (abfd) = i_shdrp; i_shdrp[t->shstrtab_section] = &t->shstrtab_hdr; - if (bfd_get_symcount (abfd) > 0) + if (need_symtab) { i_shdrp[t->symtab_section] = &t->symtab_hdr; if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF)) @@ -3261,6 +3266,7 @@ _bfd_elf_compute_section_file_positions (bfd *abfd, bfd_boolean failed; struct bfd_strtab_hash *strtab = NULL; Elf_Internal_Shdr *shstrtab_hdr; + bfd_boolean need_symtab; if (abfd->output_has_begun) return TRUE; @@ -3285,7 +3291,11 @@ _bfd_elf_compute_section_file_positions (bfd *abfd, return FALSE; /* The backend linker builds symbol table information itself. */ - if (link_info == NULL && bfd_get_symcount (abfd) > 0) + need_symtab = (link_info == NULL + && (bfd_get_symcount (abfd) > 0 + || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC)) + == HAS_RELOC))); + if (need_symtab) { /* Non-zero if doing a relocatable link. */ int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC)); @@ -3316,7 +3326,7 @@ _bfd_elf_compute_section_file_positions (bfd *abfd, if (!assign_file_positions_except_relocs (abfd, link_info)) return FALSE; - if (link_info == NULL && bfd_get_symcount (abfd) > 0) + if (need_symtab) { file_ptr off; Elf_Internal_Shdr *hdr; diff --git a/binutils/ChangeLog b/binutils/ChangeLog index b5a7f6c22e0..87badcd2da7 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2009-03-13 H.J. Lu + + PR binutils/9945 + * objcopy.c (copy_object): Clear HAS_RELOC when stripping all. + 2009-03-11 Chris Demetriou * ar.c (deterministic): New global variable. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 07d4f3f3a4d..9dcf9b5150a 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1396,6 +1396,9 @@ copy_object (bfd *ibfd, bfd *obfd) flags &= ~bfd_flags_to_clear; flags &= bfd_applicable_file_flags (obfd); + if (strip_symbols == STRIP_ALL) + flags &= ~HAS_RELOC; + if (!bfd_set_start_address (obfd, start) || !bfd_set_file_flags (obfd, flags)) { -- 2.30.2