aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf.c18
-rw-r--r--binutils/ChangeLog5
-rw-r--r--binutils/objcopy.c3
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
diff --git a/bfd/elf.c b/bfd/elf.c
index 97ac5cb..8ca5ef9 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 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))
{