diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf.c | 18 | ||||
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/objcopy.c | 3 |
4 files changed, 29 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7cbe0a2..5bd669d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2009-03-13 H.J. Lu <hongjiu.lu@intel.com> + + 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 <nickc@redhat.com> PR 9934 @@ -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 b5a7f6c..87badcd 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2009-03-13 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/9945 + * objcopy.c (copy_object): Clear HAS_RELOC when stripping all. + 2009-03-11 Chris Demetriou <cgd@google.com> * ar.c (deterministic): New global variable. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 07d4f3f..9dcf9b5 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)) { |