aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/elf32-ppc.c44
-rw-r--r--bfd/elf64-ppc.c40
-rw-r--r--bfd/version.h2
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/testsuite/ld-elfweak/elfweak.exp4
-rw-r--r--ld/testsuite/ld-powerpc/elfv2-2so.d2
6 files changed, 45 insertions, 52 deletions
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 3fd9f28..1ed995b 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -53,6 +53,10 @@ static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
static bfd_reloc_status_type ppc_elf_unhandled_reloc
(bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+#endif
+
/* Branch prediction bit for branch taken relocs. */
#define BRANCH_PREDICT_BIT 0x200000
/* Mask to set RA in memory instructions. */
@@ -702,13 +706,10 @@ ppc_elf_howto_init (void)
{
unsigned int i, type;
- for (i = 0;
- i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
- i++)
+ for (i = 0; i < ARRAY_SIZE (ppc_elf_howto_raw); i++)
{
type = ppc_elf_howto_raw[i].type;
- if (type >= (sizeof (ppc_elf_howto_table)
- / sizeof (ppc_elf_howto_table[0])))
+ if (type >= ARRAY_SIZE (ppc_elf_howto_table))
abort ();
ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
}
@@ -870,9 +871,7 @@ ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
{
unsigned int i;
- for (i = 0;
- i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
- i++)
+ for (i = 0; i < ARRAY_SIZE (ppc_elf_howto_raw); i++)
if (ppc_elf_howto_raw[i].name != NULL
&& strcasecmp (ppc_elf_howto_raw[i].name, r_name) == 0)
return &ppc_elf_howto_raw[i];
@@ -894,7 +893,8 @@ ppc_elf_info_to_howto (bfd *abfd,
ppc_elf_howto_init ();
r_type = ELF32_R_TYPE (dst->r_info);
- if (r_type >= R_PPC_max)
+ if (r_type >= ARRAY_SIZE (ppc_elf_howto_table)
+ || ppc_elf_howto_table[r_type] == NULL)
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
@@ -904,19 +904,6 @@ ppc_elf_info_to_howto (bfd *abfd,
}
cache_ptr->howto = ppc_elf_howto_table[r_type];
-
- /* Just because the above assert didn't trigger doesn't mean that
- ELF32_R_TYPE (dst->r_info) is necessarily a valid relocation. */
- if (cache_ptr->howto == NULL)
- {
- /* xgettext:c-format */
- _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
- abfd, r_type);
- bfd_set_error (bfd_error_bad_value);
-
- return false;
- }
-
return true;
}
@@ -7088,12 +7075,11 @@ ppc_elf_relocate_section (bfd *output_bfd,
/* For relocs against symbols from removed linkonce sections,
or sections discarded by a linker script, we just want the
section contents zeroed. Avoid any special processing. */
- howto = NULL;
- if (r_type < R_PPC_max)
- howto = ppc_elf_howto_table[r_type];
-
- _bfd_clear_contents (howto, input_bfd, input_section,
- contents, rel->r_offset);
+ if (r_type < ARRAY_SIZE (ppc_elf_howto_table)
+ && ppc_elf_howto_table[r_type] != NULL)
+ _bfd_clear_contents (ppc_elf_howto_table[r_type],
+ input_bfd, input_section,
+ contents, rel->r_offset);
wrel->r_offset = rel->r_offset;
wrel->r_info = 0;
wrel->r_addend = 0;
@@ -7653,7 +7639,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
addend = rel->r_addend;
save_unresolved_reloc = unresolved_reloc;
howto = NULL;
- if (r_type < R_PPC_max)
+ if (r_type < ARRAY_SIZE (ppc_elf_howto_table))
howto = ppc_elf_howto_table[r_type];
tls_type = 0;
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index e6c90a6..7868063 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -1379,7 +1379,8 @@ ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
ppc_howto_init ();
type = ELF64_R_TYPE (dst->r_info);
- if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
+ if (type >= ARRAY_SIZE (ppc64_elf_howto_table)
+ || ppc64_elf_howto_table[type] == NULL)
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
@@ -1388,15 +1389,6 @@ ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
return false;
}
cache_ptr->howto = ppc64_elf_howto_table[type];
- if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
- {
- /* xgettext:c-format */
- _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
- abfd, type);
- bfd_set_error (bfd_error_bad_value);
- return false;
- }
-
return true;
}
@@ -5104,7 +5096,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
ppc_howto_init ();
/* xgettext:c-format */
- info->callbacks->einfo (_("%H: %s reloc unsupported "
+ info->callbacks->einfo (_("%H: %s unsupported "
"in shared libraries and PIEs\n"),
abfd, sec, rel->r_offset,
ppc64_elf_howto_table[r_type]->name);
@@ -5274,7 +5266,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (ppc64_sec->sec_type != sec_toc
|| rel->r_offset % 8 != 0)
{
- info->callbacks->einfo (_("%H: %s reloc unsupported here\n"),
+ info->callbacks->einfo (_("%H: %s unsupported here\n"),
abfd, sec, rel->r_offset,
ppc64_elf_howto_table[r_type]->name);
bfd_set_error (bfd_error_bad_value);
@@ -15685,9 +15677,11 @@ ppc64_elf_relocate_section (bfd *output_bfd,
if (sec != NULL && discarded_section (sec))
{
- _bfd_clear_contents (ppc64_elf_howto_table[r_type],
- input_bfd, input_section,
- contents, rel->r_offset);
+ if (r_type < ARRAY_SIZE (ppc64_elf_howto_table)
+ && ppc64_elf_howto_table[r_type] != NULL)
+ _bfd_clear_contents (ppc64_elf_howto_table[r_type],
+ input_bfd, input_section,
+ contents, rel->r_offset);
wrel->r_offset = rel->r_offset;
wrel->r_info = 0;
wrel->r_addend = 0;
@@ -15750,6 +15744,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
relocs are used with non-tls syms. */
if (r_symndx != STN_UNDEF
&& r_type != R_PPC64_NONE
+ && r_type < ARRAY_SIZE (ppc64_elf_howto_table)
+ && ppc64_elf_howto_table[r_type] != NULL
&& (h == NULL
|| h->elf.root.type == bfd_link_hash_defined
|| h->elf.root.type == bfd_link_hash_defweak)
@@ -16865,9 +16861,15 @@ ppc64_elf_relocate_section (bfd *output_bfd,
switch (r_type)
{
default:
- /* xgettext:c-format */
- _bfd_error_handler (_("%pB: %s unsupported"),
- input_bfd, ppc64_elf_howto_table[r_type]->name);
+ if (r_type < ARRAY_SIZE (ppc64_elf_howto_table)
+ && ppc64_elf_howto_table[r_type] != NULL)
+ /* xgettext:c-format */
+ _bfd_error_handler (_("%pB: %s unsupported"),
+ input_bfd, ppc64_elf_howto_table[r_type]->name);
+ else
+ /* xgettext:c-format */
+ _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+ input_bfd, r_type);
bfd_set_error (bfd_error_bad_value);
ret = false;
@@ -17909,7 +17911,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* Dynamic relocs are not propagated for SEC_DEBUGGING sections
because such sections are not SEC_ALLOC and thus ld.so will
not process them. */
- howto = ppc64_elf_howto_table[(int) r_type];
+ howto = ppc64_elf_howto_table[r_type];
if (unresolved_reloc
&& !((input_section->flags & SEC_DEBUGGING) != 0
&& h->elf.def_dynamic)
diff --git a/bfd/version.h b/bfd/version.h
index 864ebe4..c4f5e1b 100644
--- a/bfd/version.h
+++ b/bfd/version.h
@@ -16,7 +16,7 @@
In releases, the date is not included in either version strings or
sonames. */
-#define BFD_VERSION_DATE 20250728
+#define BFD_VERSION_DATE 20250729
#define BFD_VERSION @bfd_version@
#define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@
#define REPORT_BUGS_TO @report_bugs_to@
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 37c745a..7b03989 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2025-07-29 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * testsuite/ld-elfweak/elfweak.exp: Enable on *-*-solaris2* rather
+ than sparc*-*-solaris2* only.
+
2025-07-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* testsuite/ld-plugin/lto.exp (PR ld/28138 test): Raise fd limit
diff --git a/ld/testsuite/ld-elfweak/elfweak.exp b/ld/testsuite/ld-elfweak/elfweak.exp
index aa6c29a..4e5ac42 100644
--- a/ld/testsuite/ld-elfweak/elfweak.exp
+++ b/ld/testsuite/ld-elfweak/elfweak.exp
@@ -35,7 +35,8 @@ if { ![check_shared_lib_support] } {
# This test can only be run on a couple of ELF platforms.
# Square bracket expressions seem to confuse istarget.
# This is similar to the test that is used in ld-shared, BTW.
-if { ![istarget alpha*-*-linux*]
+if { ![istarget *-*-solaris2*]
+ && ![istarget alpha*-*-linux*]
&& ![istarget arm*-*-linux*]
&& ![istarget hppa*64*-*-hpux*]
&& ![istarget hppa*-*-linux*]
@@ -52,7 +53,6 @@ if { ![istarget alpha*-*-linux*]
&& ![istarget powerpc*-*-sysv4*]
&& ![istarget sh\[34\]*-*-linux*]
&& ![istarget sparc*-*-elf]
- && ![istarget sparc*-*-solaris2*]
&& ![istarget sparc*-*-linux*]
&& ![istarget x86_64-*-linux*] } {
return
diff --git a/ld/testsuite/ld-powerpc/elfv2-2so.d b/ld/testsuite/ld-powerpc/elfv2-2so.d
index 56b1434..18bc87f 100644
--- a/ld/testsuite/ld-powerpc/elfv2-2so.d
+++ b/ld/testsuite/ld-powerpc/elfv2-2so.d
@@ -2,4 +2,4 @@
#source: elfv2-2b.s
#as: -a64
#ld: -melf64ppc -shared -e f1
-#error: .* R_PPC64_ADDR64_LOCAL reloc unsupported in shared libraries and PIEs.*
+#error: .* R_PPC64_ADDR64_LOCAL unsupported in shared libraries and PIEs.*