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.

binutils/

2009-03-13  H.J. Lu  <hongjiu.lu@intel.com>

	PR binutils/9945
	* objcopy.c (copy_object): Clear HAS_RELOC when stripping all.
This commit is contained in:
H.J. Lu 2009-03-13 13:39:57 +00:00
parent ce98a316e9
commit 3516e9841c
4 changed files with 29 additions and 4 deletions

View file

@ -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

View file

@ -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;

View file

@ -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.

View file

@ -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))
{