Skip to content

Commit

Permalink
i386: Simplify VxWorks for non-PIC
Browse files Browse the repository at this point in the history
Change

  if (PIC)
    {
      #1
    }
  else
    {
      #2
      if (VxWorks)
        {
          #3
        }
    }
  #4
  if (VxWorks && !PIC)
    {
      #5
    }

to

  #4
  if (PIC)
    {
      #1
    }
  else
    {
      #2
      if (VxWorks)
        {
          #3
          #5
        }
    }

	* elf32-i386.c (elf_i386_finish_dynamic_sections): Simplify
	VxWorks for non-PIC.
  • Loading branch information
hjl-tools committed Apr 27, 2017
1 parent 55bcecd commit 1f78f64
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 32 deletions.
5 changes: 5 additions & 0 deletions bfd/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2017-04-27 H.J. Lu <hongjiu.lu@intel.com>

* elf32-i386.c (elf_i386_finish_dynamic_sections): Simplify
VxWorks for non-PIC.

2017-04-27 Alan Modra <amodra@gmail.com>

* elf-bfd.h (struct elf_backend_data): Make asection param of
Expand Down
62 changes: 30 additions & 32 deletions bfd/elf32-i386.c
Original file line number Diff line number Diff line change
Expand Up @@ -5848,9 +5848,15 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
}

/* Fill in the first entry in the procedure linkage table. */
if (htab->elf.splt && htab->elf.splt->size > 0)
{
/* UnixWare sets the entsize of .plt to 4, although that doesn't
really seem like the right value. */
elf_section_data (htab->elf.splt->output_section)
->this_hdr.sh_entsize = 4;

/* Fill in the special first entry in the procedure linkage
table. */
if (bfd_link_pic (info))
{
memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
Expand Down Expand Up @@ -5882,6 +5888,9 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
if (abed->is_vxworks)
{
Elf_Internal_Rela rel;
int num_plts = (htab->elf.splt->size
/ abed->plt->plt_entry_size) - 1;
unsigned char *p;

/* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
On IA32 we use REL relocations so the addend goes in
Expand All @@ -5900,39 +5909,28 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
bfd_elf32_swap_reloc_out (output_bfd, &rel,
htab->srelplt2->contents +
sizeof (Elf32_External_Rel));
}
}

/* UnixWare sets the entsize of .plt to 4, although that doesn't
really seem like the right value. */
elf_section_data (htab->elf.splt->output_section)
->this_hdr.sh_entsize = 4;

/* Correct the .rel.plt.unloaded relocations. */
if (abed->is_vxworks && !bfd_link_pic (info))
{
int num_plts = (htab->elf.splt->size
/ abed->plt->plt_entry_size) - 1;
unsigned char *p;

p = htab->srelplt2->contents;
if (bfd_link_pic (info))
p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
else
p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);

for (; num_plts; num_plts--)
{
Elf_Internal_Rela rel;
bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
p += sizeof (Elf32_External_Rel);
/* Correct the .rel.plt.unloaded relocations. */
p = htab->srelplt2->contents;
if (bfd_link_pic (info))
p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
else
p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);

bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
p += sizeof (Elf32_External_Rel);
for (; num_plts; num_plts--)
{
bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
p += sizeof (Elf32_External_Rel);

bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
R_386_32);
bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
p += sizeof (Elf32_External_Rel);
}
}
}
}
Expand Down

0 comments on commit 1f78f64

Please sign in to comment.