| Index: bfd/coffcode.h
|
| diff --git a/bfd/coffcode.h b/bfd/coffcode.h
|
| index 62eeb20d763011d1b8fd534173e03f99f7e02af5..542b5b7039d92deafaef390a4bf6239a96e3efb6 100644
|
| --- a/bfd/coffcode.h
|
| +++ b/bfd/coffcode.h
|
| @@ -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
|
| @@ -372,6 +370,7 @@ CODE_FRAGMENT
|
| #define STRING_SIZE_SIZE 4
|
|
|
| #define DOT_DEBUG ".debug"
|
| +#define DOT_ZDEBUG ".zdebug"
|
| #define GNU_LINKONCE_WI ".gnu.linkonce.wi."
|
| #define GNU_LINKONCE_WT ".gnu.linkonce.wt."
|
| #define DOT_RELOC ".reloc"
|
| @@ -545,7 +544,8 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
| styp_flags = STYP_LIT;
|
| #endif /* _LIT */
|
| }
|
| - else if (CONST_STRNEQ (sec_name, DOT_DEBUG))
|
| + else if (CONST_STRNEQ (sec_name, DOT_DEBUG)
|
| + || CONST_STRNEQ (sec_name, DOT_ZDEBUG))
|
| {
|
| /* Handle the XCOFF debug section and DWARF2 debug sections. */
|
| if (!sec_name[6])
|
| @@ -652,6 +652,7 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
| bfd_boolean is_dbg = FALSE;
|
|
|
| if (CONST_STRNEQ (sec_name, DOT_DEBUG)
|
| + || CONST_STRNEQ (sec_name, DOT_ZDEBUG)
|
| #ifdef COFF_LONG_SECTION_NAMES
|
| || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
|
| || CONST_STRNEQ (sec_name, GNU_LINKONCE_WT)
|
| @@ -704,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)
|
| @@ -794,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
|
| @@ -821,6 +828,7 @@ styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED,
|
| sec_flags |= SEC_ALLOC;
|
| }
|
| else if (CONST_STRNEQ (name, DOT_DEBUG)
|
| + || CONST_STRNEQ (name, DOT_ZDEBUG)
|
| #ifdef _COMMENT
|
| || strcmp (name, _COMMENT) == 0
|
| #endif
|
| @@ -1158,6 +1166,7 @@ styp_to_sec_flags (bfd *abfd,
|
| bfd_boolean is_dbg = FALSE;
|
|
|
| if (CONST_STRNEQ (name, DOT_DEBUG)
|
| + || CONST_STRNEQ (name, DOT_ZDEBUG)
|
| #ifdef COFF_LONG_SECTION_NAMES
|
| || CONST_STRNEQ (name, GNU_LINKONCE_WI)
|
| || CONST_STRNEQ (name, GNU_LINKONCE_WT)
|
| @@ -1380,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;
|
| @@ -3354,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)
|
| @@ -3442,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
|
| @@ -3944,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;
|
|
|