X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf64-alpha.c;h=4e4efae0b1bf2d76980d7f51a6a4183674d3e1de;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=d4ac0c1469319eeb763d63f650f8b75c2f5a0ae4;hpb=ed7e9d0bdaa0cbeb157e427c262e692a993e4432;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c index d4ac0c1469..4e4efae0b1 100644 --- a/bfd/elf64-alpha.c +++ b/bfd/elf64-alpha.c @@ -1,5 +1,5 @@ /* Alpha specific support for 64-bit ELF - Copyright (C) 1996-2019 Free Software Foundation, Inc. + Copyright (C) 1996-2020 Free Software Foundation, Inc. Contributed by Richard Henderson . This file is part of BFD, the Binary File Descriptor library. @@ -144,14 +144,14 @@ struct alpha_elf_reloc_entry /* Which .reloc section? */ asection *srel; - /* What kind of relocation? */ - unsigned int rtype; - - /* Is this against read-only section? */ - unsigned int reltext : 1; + /* Which section this relocation is against? */ + asection *sec; /* How many did we find? */ unsigned long count; + + /* What kind of relocation? */ + unsigned int rtype; }; struct alpha_elf_link_hash_entry @@ -280,7 +280,7 @@ static struct bfd_link_hash_table * elf64_alpha_bfd_link_hash_table_create (bfd *abfd) { struct alpha_elf_link_hash_table *ret; - bfd_size_type amt = sizeof (struct alpha_elf_link_hash_table); + size_t amt = sizeof (struct alpha_elf_link_hash_table); ret = (struct alpha_elf_link_hash_table *) bfd_zmalloc (amt); if (ret == (struct alpha_elf_link_hash_table *) NULL) @@ -1136,9 +1136,7 @@ elf64_alpha_info_to_howto (bfd *abfd, arelent *cache_ptr, /* Handle an Alpha specific section when reading an object file. This is called when bfd_section_from_shdr finds a section with an unknown - type. - FIXME: We need to handle the SHF_ALPHA_GPREL flag, but I'm not sure - how to. */ + type. */ static bfd_boolean elf64_alpha_section_from_shdr (bfd *abfd, @@ -1180,10 +1178,10 @@ elf64_alpha_section_from_shdr (bfd *abfd, /* Convert Alpha specific section flags to bfd internal section flags. */ static bfd_boolean -elf64_alpha_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr) +elf64_alpha_section_flags (const Elf_Internal_Shdr *hdr) { if (hdr->sh_flags & SHF_ALPHA_GPREL) - *flags |= SEC_SMALL_DATA; + hdr->bfd_section->flags |= SEC_SMALL_DATA; return TRUE; } @@ -1387,18 +1385,23 @@ elf64_alpha_read_ecoff_info (bfd *abfd, asection *section, /* The symbolic header contains absolute file offsets and sizes to read. */ #define READ(ptr, offset, count, size, type) \ - if (symhdr->count == 0) \ - debug->ptr = NULL; \ - else \ + do \ { \ - bfd_size_type amt = (bfd_size_type) size * symhdr->count; \ - debug->ptr = (type) bfd_malloc (amt); \ - if (debug->ptr == NULL) \ + size_t amt; \ + debug->ptr = NULL; \ + if (symhdr->count == 0) \ + break; \ + if (_bfd_mul_overflow (size, symhdr->count, &amt)) \ + { \ + bfd_set_error (bfd_error_file_too_big); \ + goto error_return; \ + } \ + if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0) \ goto error_return; \ - if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \ - || bfd_bread (debug->ptr, amt, abfd) != amt) \ + debug->ptr = (type) _bfd_malloc_and_read (abfd, amt, amt); \ + if (debug->ptr == NULL) \ goto error_return; \ - } + } while (0) READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *); READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *); @@ -1419,30 +1422,18 @@ elf64_alpha_read_ecoff_info (bfd *abfd, asection *section, return TRUE; error_return: - if (ext_hdr != NULL) - free (ext_hdr); - if (debug->line != NULL) - free (debug->line); - if (debug->external_dnr != NULL) - free (debug->external_dnr); - if (debug->external_pdr != NULL) - free (debug->external_pdr); - if (debug->external_sym != NULL) - free (debug->external_sym); - if (debug->external_opt != NULL) - free (debug->external_opt); - if (debug->external_aux != NULL) - free (debug->external_aux); - if (debug->ss != NULL) - free (debug->ss); - if (debug->ssext != NULL) - free (debug->ssext); - if (debug->external_fdr != NULL) - free (debug->external_fdr); - if (debug->external_rfd != NULL) - free (debug->external_rfd); - if (debug->external_ext != NULL) - free (debug->external_ext); + free (ext_hdr); + free (debug->line); + free (debug->external_dnr); + free (debug->external_pdr); + free (debug->external_sym); + free (debug->external_opt); + free (debug->external_aux); + free (debug->ss); + free (debug->ssext); + free (debug->external_fdr); + free (debug->external_rfd); + free (debug->external_ext); return FALSE; } @@ -1468,7 +1459,8 @@ elf64_alpha_find_nearest_line (bfd *abfd, asymbol **symbols, filename_ptr, functionname_ptr, line_ptr, discriminator_ptr, dwarf_debug_sections, - &elf_tdata (abfd)->dwarf2_find_line_info)) + &elf_tdata (abfd)->dwarf2_find_line_info) + == 1) return TRUE; msec = bfd_get_section_by_name (abfd, ".mdebug"); @@ -1723,7 +1715,7 @@ get_got_entry (bfd *abfd, struct alpha_elf_link_hash_entry *h, if (!gotent) { int entry_size; - bfd_size_type amt; + size_t amt; amt = sizeof (struct alpha_elf_got_entry); gotent = (struct alpha_elf_got_entry *) bfd_alloc (abfd, amt); @@ -1786,7 +1778,6 @@ elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info, Elf_Internal_Shdr *symtab_hdr; struct alpha_elf_link_hash_entry **sym_hashes; const Elf_Internal_Rela *rel, *relend; - bfd_size_type amt; if (bfd_link_relocatable (info)) return TRUE; @@ -1989,15 +1980,15 @@ elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info, if (!rent) { - amt = sizeof (struct alpha_elf_reloc_entry); + size_t amt = sizeof (struct alpha_elf_reloc_entry); rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt); if (!rent) return FALSE; rent->srel = sreloc; + rent->sec = sec; rent->rtype = r_type; rent->count = 1; - rent->reltext = (sec->flags & SEC_READONLY) != 0; rent->next = h->reloc_entries; h->reloc_entries = rent; @@ -2011,7 +2002,13 @@ elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info, loaded into memory, we need a RELATIVE reloc. */ sreloc->size += sizeof (Elf64_External_Rela); if (sec->flags & SEC_READONLY) - info->flags |= DF_TEXTREL; + { + info->flags |= DF_TEXTREL; + info->callbacks->minfo + (_("%pB: dynamic relocation against `%pT' in " + "read-only section `%pA'\n"), + sec->owner, h->root.root.root.string, sec); + } } } } @@ -2696,10 +2693,17 @@ elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h, bfd_link_pie (info)); if (entries) { + asection *sec = relent->sec; relent->srel->size += entries * sizeof (Elf64_External_Rela) * relent->count; - if (relent->reltext) - info->flags |= DT_TEXTREL; + if ((sec->flags & SEC_READONLY) != 0) + { + info->flags |= DT_TEXTREL; + info->callbacks->minfo + (_("%pB: dynamic relocation against `%pT' in " + "read-only section `%pA'\n"), + sec->owner, h->root.root.root.string, sec); + } } } @@ -3170,12 +3174,10 @@ elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval) if (!gpdisp || gpdisp->r_addend != 4) { - if (tsec_free) - free (tsec_free); + free (tsec_free); return 0; } - if (tsec_free) - free (tsec_free); + free (tsec_free); } /* We've now determined that we can skip an initial gp load. Verify @@ -4021,14 +4023,11 @@ elf64_alpha_relax_section (bfd *abfd, asection *sec, return TRUE; error_return: - if (isymbuf != NULL - && symtab_hdr->contents != (unsigned char *) isymbuf) + if (symtab_hdr->contents != (unsigned char *) isymbuf) free (isymbuf); - if (info.contents != NULL - && elf_section_data (sec)->this_hdr.contents != info.contents) + if (elf_section_data (sec)->this_hdr.contents != info.contents) free (info.contents); - if (internal_relocs != NULL - && elf_section_data (sec)->relocs != internal_relocs) + if (elf_section_data (sec)->relocs != internal_relocs) free (internal_relocs); return FALSE; } @@ -5522,6 +5521,9 @@ static const struct elf_size_info alpha_elf_size_info = #define elf_backend_special_sections \ elf64_alpha_special_sections +#define elf_backend_strip_zero_sized_dynamic_sections \ + _bfd_elf_strip_zero_sized_dynamic_sections + /* A few constants that determine how the .plt section is set up. */ #define elf_backend_want_got_plt 0 #define elf_backend_plt_readonly 0