X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fwrite.c;h=15330cfc3345a5b14cbb1d87def476f52c4e946b;hb=94e5c97160abbcf2274f8d58dc2900bc85c1c384;hp=bc76962c600efc442d7d180e360320f69808685d;hpb=151411f8af16723a12e0e0eedc1ecdbea648c1b0;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/write.c b/gas/write.c index bc76962c60..15330cfc33 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; @@ -1414,8 +1414,6 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) int x; flagword flags = bfd_get_section_flags (abfd, sec); unsigned int header_size, compression_header_size; - /* Maximimum compression header is 24 bytes. */ - bfd_byte compression_header[24]; if (seginfo == NULL || sec->size < 32 @@ -1431,14 +1429,18 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) return; if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB) - stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI; + { + compression_header_size + = bfd_get_compression_header_size (stdoutput, NULL); + header_size = compression_header_size; + } else - stdoutput->flags |= BFD_COMPRESS; - compression_header_size - = bfd_get_compression_header_size (stdoutput, NULL); + { + compression_header_size = 0; + header_size = 12; + } - /* Create a new frag to contain the "ZLIB" header. */ - header_size = 12 + compression_header_size; + /* Create a new frag to contain the compression header. */ first_newf = frag_alloc (ob); if (obstack_room (ob) < header_size) first_newf = frag_alloc (ob); @@ -1533,11 +1535,6 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) if (compressed_size >= uncompressed_size) return; - if (compression_header_size) - memcpy (header, compression_header, compression_header_size); - memcpy (header + compression_header_size, "ZLIB", 4); - bfd_putb64 (uncompressed_size, header + compression_header_size + 4); - /* Replace the uncompressed frag list with the compressed frag list. */ seginfo->frchainP->frch_root = first_newf; seginfo->frchainP->frch_last = last_newf; @@ -1586,7 +1583,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; } @@ -1607,7 +1606,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; } @@ -1637,7 +1638,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; @@ -2204,12 +2206,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); }