Update d_language_defn to reflect that D does not have any style of
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index dc101b511a7268d26c0163c8a23df3bdfb034944..542b5b7039d92deafaef390a4bf6239a96e3efb6 100644 (file)
@@ -1,7 +1,5 @@
 /* Support for the generic parts of most COFF variants, for BFD.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright 1990-2013 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -119,11 +117,11 @@ SUBSUBSECTION
 
        The Microsoft PE variants of the Coff object file format add
        an extension to support the use of long section names.  This
-       extension is defined in section 4 of the Microsoft PE/COFF 
+       extension is defined in section 4 of the Microsoft PE/COFF
        specification (rev 8.1).  If a section name is too long to fit
        into the section header's @code{s_name} field, it is instead
        placed into the string table, and the @code{s_name} field is
-       filled with a slash ("/") followed by the ASCII decimal 
+       filled with a slash ("/") followed by the ASCII decimal
        representation of the offset of the full name relative to the
        string table base.
 
@@ -140,11 +138,11 @@ SUBSUBSECTION
        expecting the MS standard format may become confused; @file{PEview} is
        one known example.
 
-       The functionality is supported in BFD by code implemented under 
+       The functionality is supported in BFD by code implemented under
        the control of the macro @code{COFF_LONG_SECTION_NAMES}.  If not
        defined, the format does not support long section names in any way.
-       If defined, it is used to initialise a flag, 
-       @code{_bfd_coff_long_section_names}, and a hook function pointer, 
+       If defined, it is used to initialise a flag,
+       @code{_bfd_coff_long_section_names}, and a hook function pointer,
        @code{_bfd_coff_set_long_section_names}, in the Coff backend data
        structure.  The flag controls the generation of long section names
        in output BFDs at runtime; if it is false, as it will be by default
@@ -153,7 +151,7 @@ SUBSUBSECTION
        points to a function that allows the value of the flag to be altered
        at runtime, on formats that support long section names at all; on
        other formats it points to a stub that returns an error indication.
-       
+
        With input BFDs, the flag is set according to whether any long section
        names are detected while reading the section headers.  For a completely
        new BFD, the flag is set to the default for the target format.  This
@@ -707,7 +705,7 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
        & (SEC_LINK_DUPLICATES_DISCARD | SEC_LINK_DUPLICATES_SAME_CONTENTS
           | SEC_LINK_DUPLICATES_SAME_SIZE)) != 0)
     styp_flags |= IMAGE_SCN_LNK_COMDAT;
-  
+
   /* skip LINKER_CREATED */
 
   if ((sec_flags & SEC_COFF_NOREAD) == 0)
@@ -797,6 +795,12 @@ styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED,
   else if (styp_flags & STYP_PAD)
     sec_flags = 0;
 #ifdef RS6000COFF_C
+  else if (styp_flags & STYP_EXCEPT)
+    sec_flags |= SEC_LOAD;
+  else if (styp_flags & STYP_LOADER)
+    sec_flags |= SEC_LOAD;
+  else if (styp_flags & STYP_TYPCHK)
+    sec_flags |= SEC_LOAD;
   else if (styp_flags & STYP_DWARF)
     sec_flags |= SEC_DEBUGGING;
 #endif
@@ -1385,7 +1389,7 @@ Special entry points for gdb to swap in coff symbol table parts:
 .  bfd_boolean _bfd_coff_long_section_names;
 .  bfd_boolean (*_bfd_coff_set_long_section_names)
 .    (bfd *, int);
-.  
+.
 .  unsigned int _bfd_coff_default_section_alignment_power;
 .  bfd_boolean _bfd_coff_force_symnames_in_strings;
 .  unsigned int _bfd_coff_debug_string_prefix_length;
@@ -3359,36 +3363,38 @@ coff_compute_section_file_positions (bfd * abfd)
             padding the previous section up if necessary.  */
          old_sofar = sofar;
 
+         sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
+
 #ifdef RS6000COFF_C
-         /* AIX loader checks the text section alignment of (vma - filepos)
-            So even though the filepos may be aligned wrt the o_algntext, for
-            AIX executables, this check fails. This shows up when a native
-            AIX executable is stripped with gnu strip because the default vma
-            of native is 0x10000150 but default for gnu is 0x10000140.  Gnu
-            stripped gnu excutable passes this check because the filepos is
-            0x0140.  This problem also show up with 64 bit shared objects. The
-            data section must also be aligned.  */
+         /* Make sure the file offset and the vma of .text/.data are at the
+            same page offset, so that the file can be mmap'ed without being
+            relocated.  Failing that, AIX is able to load and execute the
+            program, but it will be silently relocated (possible as
+            executables are PIE).  But the relocation is slightly costly and
+            complexify the use of addr2line or gdb.  So better to avoid it,
+            like does the native linker.  Usually gnu ld makes sure that
+            the vma of .text is the file offset so this issue shouldn't
+            appear unless you are stripping such an executable.
+
+            AIX loader checks the text section alignment of (vma - filepos),
+            and the native linker doesn't try to align the text sections.
+            For example:
+
+            0 .text         000054cc  10000128  10000128  00000128  2**5
+                             CONTENTS, ALLOC, LOAD, CODE
+         */
+
          if (!strcmp (current->name, _TEXT)
              || !strcmp (current->name, _DATA))
            {
-             bfd_vma pad;
-             bfd_vma align;
-
-             sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
-
-             align = 1 << current->alignment_power;
-             pad = abs (current->vma - sofar) % align;
-
-             if (pad)
-               {
-                 pad = align - pad;
-                 sofar += pad;
-               }
-           }
-         else
-#else
-           {
-             sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
+             bfd_vma align = 4096;
+             bfd_vma sofar_off = sofar % align;
+             bfd_vma vma_off = current->vma % align;
+
+             if (vma_off > sofar_off)
+               sofar += vma_off - sofar_off;
+             else if (vma_off < sofar_off)
+               sofar += align + vma_off - sofar_off;
            }
 #endif
          if (previous != NULL)
@@ -3447,7 +3453,7 @@ coff_compute_section_file_positions (bfd * abfd)
         incremented in coff_set_section_contents.  This is right for
         SVR3.2.  */
       if (strcmp (current->name, _LIB) == 0)
-       bfd_set_section_vma (abfd, current, 0);
+       (void) bfd_set_section_vma (abfd, current, 0);
 #endif
 
 #ifdef ALIGN_SECTIONS_IN_FILE
@@ -3949,7 +3955,7 @@ coff_write_object_contents (bfd * abfd)
          bfd_size_type amt;
 
          internal_f.f_nscns++;
-         strncpy (&(scnhdr.s_name[0]), current->name, 8);
+         memcpy (scnhdr.s_name, ".ovrflo", 8);
          scnhdr.s_paddr = current->reloc_count;
          scnhdr.s_vaddr = current->lineno_count;
          scnhdr.s_size = 0;
This page took 0.025876 seconds and 4 git commands to generate.