diff options
-rw-r--r-- | bfd/elf32-ppc.c | 44 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 40 | ||||
-rw-r--r-- | bfd/version.h | 2 | ||||
-rw-r--r-- | ld/ChangeLog | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-elfweak/elfweak.exp | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-powerpc/elfv2-2so.d | 2 |
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.* |