X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Fobjcopy.c;h=3866c7f458861dd522a44e07b20d8485f66719b1;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=3b9f1b73ca90b52d46091a39856ecf8e9a65bb57;hpb=d1faf7ca0a9ecbc7f89998638e5cf08d3dca6e84;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 3b9f1b73ca..3866c7f458 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1549,12 +1549,13 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms, /* Check if we will remove the current leading character. */ rem_leading_char = - (name[0] == bfd_get_symbol_leading_char (abfd)) - && (change_leading_char - || (remove_leading_char - && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0 - || undefined - || bfd_is_com_section (bfd_asymbol_section (sym))))); + (name[0] != '\0' + && name[0] == bfd_get_symbol_leading_char (abfd) + && (change_leading_char + || (remove_leading_char + && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0 + || undefined + || bfd_is_com_section (bfd_asymbol_section (sym)))))); /* Check if we will add a new leading character. */ add_leading_char = @@ -2561,6 +2562,23 @@ merge_gnu_build_notes (bfd * abfd, return size; } +static flagword +check_new_section_flags (flagword flags, bfd * abfd, const char * secname) +{ + /* Only set the SEC_COFF_SHARED flag on COFF files. + The same bit value is used by ELF targets to indicate + compressed sections, and setting that flag here breaks + things. */ + if ((flags & SEC_COFF_SHARED) + && bfd_get_flavour (abfd) != bfd_target_coff_flavour) + { + non_fatal (_("%s[%s]: Note - dropping 'share' flag as output format is not COFF"), + bfd_get_filename (abfd), secname); + flags &= ~ SEC_COFF_SHARED; + } + return flags; +} + /* Copy object file IBFD onto OBFD. Returns TRUE upon success, FALSE otherwise. */ @@ -2578,7 +2596,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) void *dhandle; enum bfd_architecture iarch; unsigned int imach; - unsigned int c, i; + unsigned int num_sec, i; if (ibfd->xvec->byteorder != obfd->xvec->byteorder && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN @@ -2756,6 +2774,11 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) file_alignment, section_alignment); } + + if (preserve_dates + && bfd_get_flavour (ibfd) == bfd_target_coff_flavour + && bfd_pei_p (ibfd)) + pe->timestamp = pe_data (ibfd)->coff.timestamp; } if (isympp) @@ -2809,7 +2832,10 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) pset = find_section_list (padd->name, FALSE, SECTION_CONTEXT_SET_FLAGS); if (pset != NULL) - flags = pset->flags | SEC_HAS_CONTENTS; + { + flags = pset->flags | SEC_HAS_CONTENTS; + flags = check_new_section_flags (flags, obfd, padd->name); + } else flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA; @@ -2957,6 +2983,9 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) for (pdump = dump_sections; pdump != NULL; pdump = pdump->next) { + FILE * f; + bfd_byte *contents; + osec = bfd_get_section_by_name (ibfd, pdump->name); if (osec == NULL) { @@ -2974,14 +3003,8 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) } bfd_size_type size = bfd_section_size (osec); - if (size == 0) - { - bfd_nonfatal_message (NULL, ibfd, osec, - _("can't dump section - it is empty")); - continue; - } + /* Note - we allow the dumping of zero-sized sections. */ - FILE * f; f = fopen (pdump->filename, FOPEN_WB); if (f == NULL) { @@ -2990,7 +3013,6 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) continue; } - bfd_byte *contents; if (bfd_malloc_and_get_section (ibfd, osec, &contents)) { if (fwrite (contents, 1, size, f) != size) @@ -3080,8 +3102,8 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) } } - c = bfd_count_sections (obfd); - if (c != 0 + num_sec = bfd_count_sections (obfd); + if (num_sec != 0 && (gap_fill_set || pad_to_set)) { asection **set; @@ -3092,18 +3114,18 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) increasing the section sizes as required to fill the gaps. We write out the gap contents below. */ - osections = (asection **) xmalloc (c * sizeof (asection *)); + osections = xmalloc (num_sec * sizeof (*osections)); set = osections; bfd_map_over_sections (obfd, get_sections, &set); - qsort (osections, c, sizeof (asection *), compare_section_lma); + qsort (osections, num_sec, sizeof (*osections), compare_section_lma); - gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type)); - memset (gaps, 0, c * sizeof (bfd_size_type)); + gaps = xmalloc (num_sec * sizeof (*gaps)); + memset (gaps, 0, num_sec * sizeof (*gaps)); if (gap_fill_set) { - for (i = 0; i < c - 1; i++) + for (i = 0; i < num_sec - 1; i++) { flagword flags; bfd_size_type size; /* Octets. */ @@ -3140,22 +3162,22 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) { bfd_vma lma; /* Octets. */ bfd_size_type size; /* Octets. */ - unsigned int opb = bfd_octets_per_byte (obfd, osections[c - 1]); + unsigned int opb = bfd_octets_per_byte (obfd, osections[num_sec - 1]); bfd_vma _pad_to = pad_to * opb; - lma = bfd_section_lma (osections[c - 1]) * opb; - size = bfd_section_size (osections[c - 1]); + lma = bfd_section_lma (osections[num_sec - 1]) * opb; + size = bfd_section_size (osections[num_sec - 1]); if (lma + size < _pad_to) { - if (!bfd_set_section_size (osections[c - 1], _pad_to - lma)) + if (!bfd_set_section_size (osections[num_sec - 1], _pad_to - lma)) { - bfd_nonfatal_message (NULL, obfd, osections[c - 1], + bfd_nonfatal_message (NULL, obfd, osections[num_sec - 1], _("can't add padding")); status = 1; } else { - gaps[c - 1] = _pad_to - (lma + size); + gaps[num_sec - 1] = _pad_to - (lma + size); if (max_gap < _pad_to - (lma + size)) max_gap = _pad_to - (lma + size); } @@ -3355,7 +3377,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) } } - if (gap_fill_set || pad_to_set) + if (gaps != NULL) { bfd_byte *buf; @@ -3365,8 +3387,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) buf = (bfd_byte *) xmalloc (max_gap); memset (buf, gap_fill, max_gap); - c = bfd_count_sections (obfd); - for (i = 0; i < c; i++) + for (i = 0; i < num_sec; i++) { if (gaps[i] != 0) { @@ -3949,6 +3970,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) flagword flags; const char *err; const char * name; + const char * new_name; char *prefix = NULL; bfd_boolean make_nobits; unsigned int alignment; @@ -3964,7 +3986,12 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) flags &= bfd_applicable_section_flags (ibfd); flags &= bfd_applicable_section_flags (obfd); } - name = find_section_rename (name, &flags); + new_name = find_section_rename (name, &flags); + if (new_name != name) + { + name = new_name; + flags = check_new_section_flags (flags, obfd, name); + } /* Prefix sections. */ if (prefix_alloc_sections_string @@ -3988,7 +4015,10 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) p = find_section_list (bfd_section_name (isection), FALSE, SECTION_CONTEXT_SET_FLAGS); if (p != NULL) - flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC)); + { + flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC)); + flags = check_new_section_flags (flags, obfd, bfd_section_name (isection)); + } else if (strip_symbols == STRIP_NONDEBUG && (flags & (SEC_ALLOC | SEC_GROUP)) != 0 && !is_nondebug_keep_contents_section (ibfd, isection)) @@ -4264,6 +4294,7 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg) status = 1; bfd_nonfatal_message (NULL, ibfd, isection, _("relocation count is negative")); + free (relpp); return; } } @@ -4288,7 +4319,7 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg) temp_relpp [temp_relcount++] = relpp [i]; } relcount = temp_relcount; - if (isection->orelocation == NULL) + if (relpp != isection->orelocation) free (relpp); relpp = temp_relpp; } @@ -4297,7 +4328,8 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg) if (relcount == 0) { osection->flags &= ~SEC_RELOC; - free (relpp); + if (relpp != isection->orelocation) + free (relpp); } } }