X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fobjcopy.c;h=5760d06a85959ce53ea7e52b46504cd721bfc1f5;hb=af0b2a3e85df9f49a3528e5b7578fcf9412f1acc;hp=09facf0061ea28865eabe83e6feb36c38bd35dad;hpb=a0dcf2970562c19140460a07b2c987714639cd7b;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 09facf0061..5760d06a85 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -2596,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 @@ -2774,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) @@ -2978,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) { @@ -2995,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) { @@ -3011,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) @@ -3101,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; @@ -3113,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. */ @@ -3161,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); } @@ -3376,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; @@ -3386,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) {