summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-08-29 18:35:54 +0930
committerAlan Modra <amodra@gmail.com>2019-08-29 21:07:00 +0930
commitc0d9f31dbd8765dd925e6a4b4acdb9b23d1706f6 (patch)
treef2d9204312bc52783b59059935c3b05f64745642
parentdd9b12c2451f0e46e73ec54d8762727d428b4c14 (diff)
downloadbinutils-gdb-c0d9f31dbd8765dd925e6a4b4acdb9b23d1706f6.tar.gz
PR24697, R_PPC_EMB_SDA21 cannot be used when making a shared object
This removes a restriction on various R_PPC_EMB relocations that has been present for ppc32 since 1996-04-26 git commit e25a798839. As far as I know, only those relocs that would require addressing via r2 for .sdata2/.sbss2 access are disallowed in shared libraries. PR 24697 * elf32-ppc.c (ppc_elf_check_relocs): Call bad_shared_reloc when !bfd_link_executable for R_PPC_EMB_SDA2I16 and R_PPC_EMB_SDA2REL. Don't call bad_shared_reloc for any other reloc.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-ppc.c19
2 files changed, 10 insertions, 17 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e604dc75f8e..d292e87f56b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,13 @@
2019-08-29 Alan Modra <amodra@gmail.com>
+ PR 24697
+ * elf32-ppc.c (ppc_elf_check_relocs): Call bad_shared_reloc
+ when !bfd_link_executable for R_PPC_EMB_SDA2I16 and
+ R_PPC_EMB_SDA2REL. Don't call bad_shared_reloc for any other
+ reloc.
+
+2019-08-29 Alan Modra <amodra@gmail.com>
+
* elf64-ppc.c (xlate_pcrel_opt): Add poff parameter. Allow offset
on second insn, return it in poff.
(ppc64_elf_relocate_section): Add offset to paddi addend for
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 78d39efe48c..5e5834a70ca 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -3096,11 +3096,6 @@ ppc_elf_check_relocs (bfd *abfd,
/* Indirect .sdata relocation. */
case R_PPC_EMB_SDAI16:
- if (bfd_link_pic (info))
- {
- bad_shared_reloc (abfd, r_type);
- return FALSE;
- }
htab->sdata[0].sym->ref_regular = 1;
if (!elf_allocate_pointer_linker_section (abfd, &htab->sdata[0],
h, rel))
@@ -3114,7 +3109,7 @@ ppc_elf_check_relocs (bfd *abfd,
/* Indirect .sdata2 relocation. */
case R_PPC_EMB_SDA2I16:
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
{
bad_shared_reloc (abfd, r_type);
return FALSE;
@@ -3160,7 +3155,7 @@ ppc_elf_check_relocs (bfd *abfd,
break;
case R_PPC_EMB_SDA2REL:
- if (bfd_link_pic (info))
+ if (!bfd_link_executable (info))
{
bad_shared_reloc (abfd, r_type);
return FALSE;
@@ -3177,11 +3172,6 @@ ppc_elf_check_relocs (bfd *abfd,
case R_PPC_VLE_SDA21:
case R_PPC_EMB_SDA21:
case R_PPC_EMB_RELSDA:
- if (bfd_link_pic (info))
- {
- bad_shared_reloc (abfd, r_type);
- return FALSE;
- }
if (h != NULL)
{
ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
@@ -3194,11 +3184,6 @@ ppc_elf_check_relocs (bfd *abfd,
case R_PPC_EMB_NADDR16_LO:
case R_PPC_EMB_NADDR16_HI:
case R_PPC_EMB_NADDR16_HA:
- if (bfd_link_pic (info))
- {
- bad_shared_reloc (abfd, r_type);
- return FALSE;
- }
if (h != NULL)
h->non_got_ref = TRUE;
break;