aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-04-27 08:55:36 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-04-27 08:55:36 -0700
commit1f78f649e868979d36490d7c2ea0b3d41abc5ec6 (patch)
treef88f434e829ca70d463ffbd9cd185dfaf170a8f2 /bfd
parent55bcecda5703eb4647165cb3ddb86aed63fd44d2 (diff)
downloadfsf-binutils-gdb-1f78f649e868979d36490d7c2ea0b3d41abc5ec6.zip
fsf-binutils-gdb-1f78f649e868979d36490d7c2ea0b3d41abc5ec6.tar.gz
fsf-binutils-gdb-1f78f649e868979d36490d7c2ea0b3d41abc5ec6.tar.bz2
i386: Simplify VxWorks for non-PIC
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-i386.c62
2 files changed, 35 insertions, 32 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 376f201..5f8f67c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 78c5d5b..45c6c0e 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -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,
@@ -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
@@ -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);
+ }
}
}
}