diff options
-rw-r--r-- | bfd/cofflink.c | 2 | ||||
-rw-r--r-- | bfd/cpu-arm.c | 6 | ||||
-rw-r--r-- | bfd/elf-eh-frame.c | 1 | ||||
-rw-r--r-- | bfd/elf-hppa.h | 3 | ||||
-rw-r--r-- | bfd/elf-m10300.c | 7 | ||||
-rw-r--r-- | bfd/elf-sframe.c | 1 | ||||
-rw-r--r-- | bfd/elf.c | 2 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 3 | ||||
-rw-r--r-- | bfd/elf32-avr.c | 2 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 5 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 15 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 4 | ||||
-rw-r--r-- | bfd/elflink.c | 4 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 1 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 2 | ||||
-rw-r--r-- | bfd/linker.c | 45 | ||||
-rw-r--r-- | bfd/opncls.c | 7 | ||||
-rw-r--r-- | bfd/peXXigen.c | 8 | ||||
-rw-r--r-- | bfd/pei-x86_64.c | 2 | ||||
-rw-r--r-- | bfd/stabs.c | 6 | ||||
-rw-r--r-- | bfd/xcofflink.c | 16 |
21 files changed, 93 insertions, 49 deletions
diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 3174bd3..0de2e0b 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -1213,7 +1213,7 @@ process_embedded_commands (bfd *output_bfd, char *e; bfd_byte *copy; - if (!sec) + if (sec == NULL || (sec->flags & SEC_HAS_CONTENTS) == 0) return 1; if (!bfd_malloc_and_get_section (abfd, sec, ©)) diff --git a/bfd/cpu-arm.c b/bfd/cpu-arm.c index 09bcf5b..03482b0 100644 --- a/bfd/cpu-arm.c +++ b/bfd/cpu-arm.c @@ -418,7 +418,8 @@ bfd_arm_update_notes (bfd *abfd, const char *note_section) different. */ arm_arch_section = bfd_get_section_by_name (abfd, note_section); - if (arm_arch_section == NULL) + if (arm_arch_section == NULL + || (arm_arch_section->flags & SEC_HAS_CONTENTS) == 0) return true; buffer_size = arm_arch_section->size; @@ -521,7 +522,8 @@ bfd_arm_get_mach_from_notes (bfd *abfd, const char *note_section) different. */ arm_arch_section = bfd_get_section_by_name (abfd, note_section); - if (arm_arch_section == NULL) + if (arm_arch_section == NULL + || (arm_arch_section->flags & SEC_HAS_CONTENTS) == 0) return bfd_mach_arm_unknown; buffer_size = arm_arch_section->size; diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c index 90a5848..bf7a990 100644 --- a/bfd/elf-eh-frame.c +++ b/bfd/elf-eh-frame.c @@ -602,6 +602,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info, hdr_info = &htab->eh_info; if (sec->size == 0 + || (sec->flags & SEC_HAS_CONTENTS) == 0 || sec->sec_info_type != SEC_INFO_TYPE_NONE) { /* This file does not contain .eh_frame information. */ diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h index 7896c02..747c5b1 100644 --- a/bfd/elf-hppa.h +++ b/bfd/elf-hppa.h @@ -984,7 +984,8 @@ elf_hppa_sort_unwind (bfd *abfd) Consider what happens if someone inept creates a linker script that puts unwind information in .text. */ s = bfd_get_section_by_name (abfd, ".PARISC.unwind"); - if (s != NULL) + if (s != NULL && (s->flags & SEC_HAS_CONTENTS) != 0) + { bfd_size_type size; bfd_byte *contents; diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index bc3daec..7e084e6 100644 --- a/bfd/elf-m10300.c +++ b/bfd/elf-m10300.c @@ -2694,7 +2694,8 @@ mn10300_elf_relax_section (bfd *abfd, if (! ((section->flags & SEC_RELOC) != 0 && section->reloc_count != 0)) continue; - if ((section->flags & SEC_ALLOC) == 0) + if ((section->flags & SEC_ALLOC) == 0 + || (section->flags & SEC_HAS_CONTENTS) == 0) continue; /* Get cached copy of section contents if it exists. */ @@ -3034,7 +3035,9 @@ mn10300_elf_relax_section (bfd *abfd, unsigned int symcount; /* Skip non-code sections and empty sections. */ - if ((section->flags & SEC_CODE) == 0 || section->size == 0) + if ((section->flags & SEC_CODE) == 0 + || (section->flags & SEC_HAS_CONTENTS) == 0 + || section->size == 0) continue; if (section->reloc_count != 0) diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c index d2954ba..57d6798 100644 --- a/bfd/elf-sframe.c +++ b/bfd/elf-sframe.c @@ -193,6 +193,7 @@ _bfd_elf_parse_sframe (bfd *abfd, int decerr = 0; if (sec->size == 0 + || (sec->flags & SEC_HAS_CONTENTS) == 0 || sec->sec_info_type != SEC_INFO_TYPE_NONE) { /* This file does not contain .sframe information. */ @@ -1689,7 +1689,7 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg) } s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s != NULL) + if (s != NULL && (s->flags & SEC_HAS_CONTENTS) != 0) { unsigned int elfsec; unsigned long shlink; diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index a6d83b9..e07e122 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -7882,7 +7882,8 @@ bfd_elf32_arm_process_before_allocation (bfd *abfd, if (sec->reloc_count == 0) continue; - if ((sec->flags & SEC_EXCLUDE) != 0) + if ((sec->flags & SEC_EXCLUDE) != 0 + || (sec->flags & SEC_HAS_CONTENTS) == 0) continue; symtab_hdr = & elf_symtab_hdr (abfd); diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c index e397468..c01355a 100644 --- a/bfd/elf32-avr.c +++ b/bfd/elf32-avr.c @@ -4216,7 +4216,7 @@ avr_elf32_load_property_records (bfd *abfd) /* Find the '.avr.prop' section and load the contents into memory. */ sec = bfd_get_section_by_name (abfd, AVR_PROPERTY_RECORD_SECTION_NAME); - if (sec == NULL) + if (sec == NULL || (sec->flags & SEC_HAS_CONTENTS) == 0) return NULL; return avr_elf32_load_records_from_section (abfd, sec); } diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 833bc74..bb77ba2 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1087,6 +1087,7 @@ _bfd_elf_ppc_set_arch (bfd *abfd) s = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME); if (s != NULL && s->size >= 24 + && (s->flags & SEC_HAS_CONTENTS) != 0 && bfd_malloc_and_get_section (abfd, s, &contents)) { unsigned int apuinfo_size = bfd_get_32 (abfd, contents + 4); @@ -1840,7 +1841,8 @@ ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms, /* If this object was prelinked, the prelinker stored the address of .glink at got[1]. If it wasn't prelinked, got[1] will be zero. */ dynamic = bfd_get_section_by_name (abfd, ".dynamic"); - if (dynamic != NULL) + if (dynamic != NULL + && (dynamic->flags & SEC_HAS_CONTENTS) != 0) { bfd_byte *dynbuf, *extdyn, *extdynend; size_t extdynsize; @@ -6106,6 +6108,7 @@ ppc_elf_relax_section (bfd *abfd, /* No need to do anything with non-alloc or non-code sections. */ if ((isec->flags & SEC_ALLOC) == 0 || (isec->flags & SEC_CODE) == 0 + || (isec->flags & SEC_HAS_CONTENTS) == 0 || (isec->flags & SEC_LINKER_CREATED) != 0 || isec->size < 4) return true; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 193e00b..069bd75 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -2472,7 +2472,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, asection *dynamic, *glink = NULL, *relplt = NULL; arelent *p; - if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents)) + if (opd != NULL + && ((opd->flags & SEC_HAS_CONTENTS) == 0 + || !bfd_malloc_and_get_section (abfd, opd, &contents))) { free_contents_and_exit_err: count = -1; @@ -2507,7 +2509,8 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, size_t extdynsize; void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *); - if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf)) + if ((dynamic->flags & SEC_HAS_CONTENTS) == 0 + || !bfd_malloc_and_get_section (abfd, dynamic, &dynbuf)) goto free_contents_and_exit_err; extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn; @@ -5536,7 +5539,8 @@ opd_entry_value (asection *opd_sec, if (contents == NULL) { - if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents)) + if ((opd_sec->flags & SEC_HAS_CONTENTS) == 0 + || !bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents)) return (bfd_vma) -1; ppc64_elf_tdata (opd_bfd)->opd.contents = contents; } @@ -7361,7 +7365,9 @@ ppc64_elf_edit_opd (struct bfd_link_info *info) continue; sec = bfd_get_section_by_name (ibfd, ".opd"); - if (sec == NULL || sec->size == 0) + if (sec == NULL + || sec->size == 0 + || (sec->flags & SEC_HAS_CONTENTS) == 0) continue; if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS) @@ -8922,6 +8928,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info) toc = bfd_get_section_by_name (ibfd, ".toc"); if (toc == NULL || toc->size == 0 + || (toc->flags & SEC_HAS_CONTENTS) == 0 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS || discarded_section (toc)) continue; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 5f89190..ef0ebdd 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -4967,7 +4967,9 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd, for (j = 0; plts[j].name != NULL; j++) { plt = bfd_get_section_by_name (abfd, plts[j].name); - if (plt == NULL || plt->size == 0) + if (plt == NULL + || plt->size == 0 + || (plt->flags & SEC_HAS_CONTENTS) == 0) continue; /* Get the PLT section contents. */ diff --git a/bfd/elflink.c b/bfd/elflink.c index 80e3a8d..bab1a36 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4386,7 +4386,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) | DYN_NO_NEEDED)) == 0; s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s != NULL && s->size != 0) + if (s != NULL && s->size != 0 && (s->flags & SEC_HAS_CONTENTS) != 0) { bfd_byte *dynbuf; bfd_byte *extdyn; @@ -8204,7 +8204,7 @@ bfd_elf_get_bfd_needed_list (bfd *abfd, return true; s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s == NULL || s->size == 0) + if (s == NULL || s->size == 0 || (s->flags & SEC_HAS_CONTENTS) == 0) return true; if (!bfd_malloc_and_get_section (abfd, s, &dynbuf)) diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index c109ccd..bf8f913 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -9880,6 +9880,7 @@ get_plt_type (bfd *abfd) bfd_byte *contents, *extdyn, *extdynend; asection *sec = bfd_get_section_by_name (abfd, ".dynamic"); if (!sec + || (sec->flags & SEC_HAS_CONTENTS) == 0 || sec->size < sizeof (ElfNN_External_Dyn) || !bfd_malloc_and_get_section (abfd, sec, &contents)) return ret; diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index e9fb61f..5b66cb8 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -16572,7 +16572,7 @@ _bfd_mips_elf_get_synthetic_symtab (bfd *abfd, return 0; plt = bfd_get_section_by_name (abfd, ".plt"); - if (plt == NULL) + if (plt == NULL || (plt->flags & SEC_HAS_CONTENTS) == 0) return 0; slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; diff --git a/bfd/linker.c b/bfd/linker.c index 4fb7a66..e57c9ee 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -2880,27 +2880,38 @@ _bfd_handle_already_linked (asection *sec, sec->owner, sec); else if (sec->size != 0) { - bfd_byte *sec_contents, *l_sec_contents = NULL; - - if (!bfd_malloc_and_get_section (sec->owner, sec, &sec_contents)) + bfd_byte *sec_contents, *l_sec_contents; + + if ((sec->flags & SEC_HAS_CONTENTS) == 0 + && (l->sec->flags & SEC_HAS_CONTENTS) == 0) + ; + else if ((sec->flags & SEC_HAS_CONTENTS) == 0 + || !bfd_malloc_and_get_section (sec->owner, sec, + &sec_contents)) info->callbacks->einfo /* xgettext:c-format */ (_("%pB: could not read contents of section `%pA'\n"), sec->owner, sec); - else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, - &l_sec_contents)) - info->callbacks->einfo - /* xgettext:c-format */ - (_("%pB: could not read contents of section `%pA'\n"), - l->sec->owner, l->sec); - else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) - info->callbacks->einfo - /* xgettext:c-format */ - (_("%pB: duplicate section `%pA' has different contents\n"), - sec->owner, sec); - - free (sec_contents); - free (l_sec_contents); + else if ((l->sec->flags & SEC_HAS_CONTENTS) == 0 + || !bfd_malloc_and_get_section (l->sec->owner, l->sec, + &l_sec_contents)) + { + info->callbacks->einfo + /* xgettext:c-format */ + (_("%pB: could not read contents of section `%pA'\n"), + l->sec->owner, l->sec); + free (sec_contents); + } + else + { + if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) + info->callbacks->einfo + /* xgettext:c-format */ + (_("%pB: duplicate section `%pA' has different contents\n"), + sec->owner, sec); + free (l_sec_contents); + free (sec_contents); + } } break; } diff --git a/bfd/opncls.c b/bfd/opncls.c index cdf09b3..abea464 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -1201,7 +1201,7 @@ bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out) sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK); - if (sect == NULL) + if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0) return NULL; size = bfd_section_size (sect); @@ -1289,7 +1289,7 @@ bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len, sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK); - if (sect == NULL) + if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0) return NULL; size = bfd_section_size (sect); @@ -1801,7 +1801,8 @@ get_build_id (bfd *abfd) return (struct bfd_build_id *) abfd->build_id; sect = bfd_get_section_by_name (abfd, ".note.gnu.build-id"); - if (sect == NULL) + if (sect == NULL + || (sect->flags & SEC_HAS_CONTENTS) == 0) { bfd_set_error (bfd_error_no_debug_section); return NULL; diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index fa2b429..43f3a83 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1288,7 +1288,7 @@ pe_print_idata (bfd * abfd, void * vfile) { /* Maybe the extra header isn't there. Look for the section. */ section = bfd_get_section_by_name (abfd, ".idata"); - if (section == NULL) + if (section == NULL || (section->flags & SEC_HAS_CONTENTS) == 0) return true; addr = section->vma; @@ -1845,6 +1845,7 @@ pe_print_pdata (bfd * abfd, void * vfile) int onaline = PDATA_ROW_SIZE; if (section == NULL + || (section->flags & SEC_HAS_CONTENTS) == 0 || coff_section_data (abfd, section) == NULL || pei_section_data (abfd, section) == NULL) return true; @@ -2014,6 +2015,7 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) struct sym_cache cache = {0, 0} ; if (section == NULL + || (section->flags & SEC_HAS_CONTENTS) == 0 || coff_section_data (abfd, section) == NULL || pei_section_data (abfd, section) == NULL) return true; @@ -2147,7 +2149,9 @@ pe_print_reloc (bfd * abfd, void * vfile) asection *section = bfd_get_section_by_name (abfd, ".reloc"); bfd_byte *p, *end; - if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS)) + if (section == NULL + || section->size == 0 + || (section->flags & SEC_HAS_CONTENTS) == 0) return true; fprintf (file, diff --git a/bfd/pei-x86_64.c b/bfd/pei-x86_64.c index c33d422..4d2ba71 100644 --- a/bfd/pei-x86_64.c +++ b/bfd/pei-x86_64.c @@ -555,6 +555,7 @@ pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section) /* Sanity checks. */ if (pdata_section == NULL + || (pdata_section->flags & SEC_HAS_CONTENTS) == 0 || coff_section_data (abfd, pdata_section) == NULL || pei_section_data (abfd, pdata_section) == NULL) return true; @@ -699,6 +700,7 @@ pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section) xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".text"); /* Transfer xdata section into xdata array. */ if (!xdata_section + || (xdata_section->flags & SEC_HAS_CONTENTS) == 0 || !bfd_malloc_and_get_section (abfd, xdata_section, &xdata)) goto done; diff --git a/bfd/stabs.c b/bfd/stabs.c index da0c61d..1cce2ae 100644 --- a/bfd/stabs.c +++ b/bfd/stabs.c @@ -162,7 +162,9 @@ _bfd_link_section_stabs (bfd *abfd, bfd_size_type *pstridx; if (stabsec->size == 0 - || stabstrsec->size == 0) + || stabstrsec->size == 0 + || (stabsec->flags & SEC_HAS_CONTENTS) == 0 + || (stabstrsec->flags & SEC_HAS_CONTENTS) == 0) /* This file does not contain stabs debugging information. */ return true; @@ -520,7 +522,7 @@ _bfd_discard_section_stabs (bfd *abfd, bfd_size_type *pstridx; int deleting; - if (stabsec->size == 0) + if (stabsec->size == 0 || (stabsec->flags & SEC_HAS_CONTENTS) == 0) /* This file does not contain stabs debugging information. */ return false; diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index b3ab780..a67f24b 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -259,7 +259,7 @@ _bfd_xcoff_get_dynamic_symtab_upper_bound (bfd *abfd) } lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) + if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0) { bfd_set_error (bfd_error_no_symbols); return -1; @@ -293,7 +293,7 @@ _bfd_xcoff_canonicalize_dynamic_symtab (bfd *abfd, asymbol **psyms) } lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) + if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0) { bfd_set_error (bfd_error_no_symbols); return -1; @@ -378,7 +378,7 @@ _bfd_xcoff_get_dynamic_reloc_upper_bound (bfd *abfd) } lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) + if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0) { bfd_set_error (bfd_error_no_symbols); return -1; @@ -413,7 +413,7 @@ _bfd_xcoff_canonicalize_dynamic_reloc (bfd *abfd, } lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) + if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0) { bfd_set_error (bfd_error_no_symbols); return -1; @@ -904,7 +904,7 @@ xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info) o_snloader field in the a.out header, rather than grabbing the section by name. */ lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) + if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0) { _bfd_error_handler (_("%pB: dynamic object with no .loader section"), @@ -2373,7 +2373,7 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd, *pneeded = false; lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) + if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0) /* There are no symbols, so don't try to include it. */ return true; @@ -4128,7 +4128,9 @@ bfd_xcoff_build_dynamic_sections (bfd *output_bfd, { /* Grab the contents of SUB's .debug section, if any. */ subdeb = bfd_get_section_by_name (sub, ".debug"); - if (subdeb != NULL && subdeb->size > 0) + if (subdeb != NULL + && subdeb->size != 0 + && (subdeb->flags & SEC_HAS_CONTENTS) != 0) { /* We use malloc and copy the names into the debug stringtab, rather than bfd_alloc, because I expect |