X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fwrite.c;h=0dfca0c01c3b88d4b1201fd1be3b9bf0b4985a92;hb=2900e701e0f0216b17e04e4fff1ca4711a9c072f;hp=aefed29ba3382075287f651cad95e474659f8851;hpb=740bdc67c057ee8012327420848eb134e1db4211;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/write.c b/gas/write.c index aefed29ba3..0dfca0c01c 100644 --- a/gas/write.c +++ b/gas/write.c @@ -1,5 +1,5 @@ /* write.c - emit .o file - Copyright (C) 1986-2015 Free Software Foundation, Inc. + Copyright (C) 1986-2016 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -192,7 +192,7 @@ fix_new_internal (fragS *frag, /* Which frag? */ TC_INIT_FIX_DATA (fixP); #endif - as_where (&fixP->fx_file, &fixP->fx_line); + fixP->fx_file = as_where (&fixP->fx_line); { @@ -355,12 +355,12 @@ record_alignment (/* Segment to which alignment pertains. */ segT seg, /* Alignment, as a power of 2 (e.g., 1 => 2-byte boundary, 2 => 4-byte boundary, etc.) */ - int align) + unsigned int align) { if (seg == absolute_section) return; - if ((unsigned int) align > bfd_get_section_alignment (stdoutput, seg)) + if (align > bfd_get_section_alignment (stdoutput, seg)) bfd_set_section_alignment (stdoutput, seg, align); } @@ -1134,7 +1134,7 @@ fix_segment (bfd *abfd ATTRIBUTE_UNUSED, static void install_reloc (asection *sec, arelent *reloc, fragS *fragp, - char *file, unsigned int line) + const char *file, unsigned int line) { char *err; bfd_reloc_status_type s; @@ -1234,7 +1234,7 @@ write_relocs (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) rp = &r->next; } - relocs = (arelent **) xcalloc (n, sizeof (arelent *)); + relocs = XCNEWVEC (arelent *, n); n = 0; r = my_reloc_list; @@ -1413,6 +1413,7 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) struct z_stream_s *strm; int x; flagword flags = bfd_get_section_flags (abfd, sec); + unsigned int header_size, compression_header_size; if (seginfo == NULL || sec->size < 32 @@ -1427,27 +1428,30 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) if (strm == NULL) return; - /* Create a new frag to contain the "ZLIB" header. */ + if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB) + { + compression_header_size + = bfd_get_compression_header_size (stdoutput, NULL); + header_size = compression_header_size; + } + else + { + compression_header_size = 0; + header_size = 12; + } + + /* Create a new frag to contain the compression header. */ first_newf = frag_alloc (ob); - if (obstack_room (ob) < 12) + if (obstack_room (ob) < header_size) first_newf = frag_alloc (ob); - if (obstack_room (ob) < 12) - as_fatal (_("can't extend frag %u chars"), 12); + if (obstack_room (ob) < header_size) + as_fatal (_("can't extend frag %u chars"), header_size); last_newf = first_newf; - obstack_blank_fast (ob, 12); + obstack_blank_fast (ob, header_size); last_newf->fr_type = rs_fill; - last_newf->fr_fix = 12; + last_newf->fr_fix = header_size; header = last_newf->fr_literal; - memcpy (header, "ZLIB", 4); - header[11] = uncompressed_size; uncompressed_size >>= 8; - header[10] = uncompressed_size; uncompressed_size >>= 8; - header[9] = uncompressed_size; uncompressed_size >>= 8; - header[8] = uncompressed_size; uncompressed_size >>= 8; - header[7] = uncompressed_size; uncompressed_size >>= 8; - header[6] = uncompressed_size; uncompressed_size >>= 8; - header[5] = uncompressed_size; uncompressed_size >>= 8; - header[4] = uncompressed_size; - compressed_size = 12; + compressed_size = header_size; /* Stream the frags through the compression engine, adding new frags as necessary to accomodate the compressed output. */ @@ -1526,18 +1530,24 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) break; } + /* PR binutils/18087: If compression didn't make the section smaller, + just keep it uncompressed. */ + if (compressed_size >= uncompressed_size) + return; + /* Replace the uncompressed frag list with the compressed frag list. */ seginfo->frchainP->frch_root = first_newf; seginfo->frchainP->frch_last = last_newf; /* Update the section size and its name. */ + bfd_update_compression_header (abfd, (bfd_byte *) header, sec); x = bfd_set_section_size (abfd, sec, compressed_size); gas_assert (x); - compressed_name = (char *) xmalloc (strlen (section_name) + 2); - compressed_name[0] = '.'; - compressed_name[1] = 'z'; - strcpy (compressed_name + 2, section_name + 1); - bfd_section_name (stdoutput, sec) = compressed_name; + if (!compression_header_size) + { + compressed_name = concat (".z", section_name + 1, (char *) NULL); + bfd_section_name (stdoutput, sec) = compressed_name; + } } static void @@ -1570,7 +1580,9 @@ write_contents (bfd *abfd ATTRIBUTE_UNUSED, f->fr_literal, (file_ptr) offset, (bfd_size_type) f->fr_fix); if (!x) - as_fatal (_("can't write %s: %s"), stdoutput->filename, + as_fatal (_("can't write %ld bytes to section %s of %s because: '%s'"), + (long) f->fr_fix, sec->name, + stdoutput->filename, bfd_errmsg (bfd_get_error ())); offset += f->fr_fix; } @@ -1591,7 +1603,9 @@ write_contents (bfd *abfd ATTRIBUTE_UNUSED, (file_ptr) offset, (bfd_size_type) fill_size); if (!x) - as_fatal (_("can't write %s: %s"), stdoutput->filename, + as_fatal (_("can't fill %ld bytes in section %s of %s because '%s'"), + (long) fill_size, sec->name, + stdoutput->filename, bfd_errmsg (bfd_get_error ())); offset += fill_size; } @@ -1621,7 +1635,8 @@ write_contents (bfd *abfd ATTRIBUTE_UNUSED, (stdoutput, sec, buf, (file_ptr) offset, (bfd_size_type) n_per_buf * fill_size); if (!x) - as_fatal (_("cannot write to output file '%s': %s"), + as_fatal (_("cannot fill %ld bytes in section %s of %s because: '%s'"), + (long)(n_per_buf * fill_size), sec->name, stdoutput->filename, bfd_errmsg (bfd_get_error ())); offset += n_per_buf * fill_size; @@ -1692,7 +1707,9 @@ set_symtab (void) of the section. This allows proper nop-filling at the end of code-bearing sections. */ #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \ - (!(FRCHAIN)->frch_next ? get_recorded_alignment (SEG) : 0) + (!(FRCHAIN)->frch_next && subseg_text_p (SEG) \ + ? get_recorded_alignment (SEG) \ + : 0) #else #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0 #endif @@ -2186,12 +2203,23 @@ write_object_file (void) obj_frob_file_after_relocs (); #endif +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF + if (IS_ELF && flag_use_elf_stt_common) + stdoutput->flags |= BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON; +#endif + /* Once all relocations have been written, we can compress the contents of the debug sections. This needs to be done before we start writing any sections, because it will affect the file layout, which is fixed once we start writing contents. */ if (flag_compress_debug) - bfd_map_over_sections (stdoutput, compress_debug, (char *) 0); + { + if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB) + stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI; + else + stdoutput->flags |= BFD_COMPRESS; + bfd_map_over_sections (stdoutput, compress_debug, (char *) 0); + } bfd_map_over_sections (stdoutput, write_contents, (char *) 0); }