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; |