mirror of
https://github.com/autc04/Retro68.git
synced 2026-04-26 11:27:07 +00:00
Update binutils to version 2.24 to work around a build problem
This commit is contained in:
+199
-123
@@ -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
|
||||
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
|
||||
@@ -361,6 +359,8 @@ CODE_FRAGMENT
|
||||
|
||||
*/
|
||||
|
||||
#include "libiberty.h"
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
#include "peicode.h"
|
||||
#else
|
||||
@@ -370,7 +370,9 @@ 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"
|
||||
|
||||
#if defined (COFF_LONG_SECTION_NAMES)
|
||||
@@ -542,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])
|
||||
@@ -555,7 +558,8 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
||||
styp_flags = STYP_DEBUG_INFO;
|
||||
}
|
||||
#ifdef COFF_LONG_SECTION_NAMES
|
||||
else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
|
||||
else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
|
||||
|| CONST_STRNEQ (sec_name, GNU_LINKONCE_WT))
|
||||
{
|
||||
styp_flags = STYP_DEBUG_INFO;
|
||||
}
|
||||
@@ -577,6 +581,17 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
||||
{
|
||||
styp_flags = STYP_TYPCHK;
|
||||
}
|
||||
else if (sec_flags & SEC_DEBUGGING)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
|
||||
if (!strcmp (sec_name, xcoff_dwsect_names[i].name))
|
||||
{
|
||||
styp_flags = STYP_DWARF | xcoff_dwsect_names[i].flag;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Try and figure out what it should be */
|
||||
else if (sec_flags & SEC_CODE)
|
||||
@@ -634,6 +649,16 @@ static long
|
||||
sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
||||
{
|
||||
long styp_flags = 0;
|
||||
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)
|
||||
#endif
|
||||
|| CONST_STRNEQ (sec_name, ".stab"))
|
||||
is_dbg = TRUE;
|
||||
|
||||
/* caution: there are at least three groups of symbols that have
|
||||
very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
|
||||
@@ -644,16 +669,20 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
||||
but there are more IMAGE_SCN_* flags. */
|
||||
|
||||
/* FIXME: There is no gas syntax to specify the debug section flag. */
|
||||
if (CONST_STRNEQ (sec_name, DOT_DEBUG)
|
||||
|| CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
|
||||
sec_flags = SEC_DEBUGGING | SEC_READONLY;
|
||||
if (is_dbg)
|
||||
{
|
||||
sec_flags &= (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
|
||||
| SEC_LINK_DUPLICATES_SAME_CONTENTS
|
||||
| SEC_LINK_DUPLICATES_SAME_SIZE);
|
||||
sec_flags |= SEC_DEBUGGING | SEC_READONLY;
|
||||
}
|
||||
|
||||
/* skip LOAD */
|
||||
/* READONLY later */
|
||||
/* skip RELOC */
|
||||
if ((sec_flags & SEC_CODE) != 0)
|
||||
styp_flags |= IMAGE_SCN_CNT_CODE;
|
||||
if ((sec_flags & SEC_DATA) != 0)
|
||||
if ((sec_flags & (SEC_DATA | SEC_DEBUGGING)) != 0)
|
||||
styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
|
||||
if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
|
||||
styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */
|
||||
@@ -664,15 +693,19 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
|
||||
styp_flags |= IMAGE_SCN_LNK_COMDAT;
|
||||
if ((sec_flags & SEC_DEBUGGING) != 0)
|
||||
styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
|
||||
if ((sec_flags & SEC_EXCLUDE) != 0)
|
||||
if ((sec_flags & SEC_EXCLUDE) != 0 && !is_dbg)
|
||||
styp_flags |= IMAGE_SCN_LNK_REMOVE;
|
||||
if ((sec_flags & SEC_NEVER_LOAD) != 0)
|
||||
if ((sec_flags & SEC_NEVER_LOAD) != 0 && !is_dbg)
|
||||
styp_flags |= IMAGE_SCN_LNK_REMOVE;
|
||||
/* skip IN_MEMORY */
|
||||
/* skip SORT */
|
||||
if (sec_flags & SEC_LINK_ONCE)
|
||||
styp_flags |= IMAGE_SCN_LNK_COMDAT;
|
||||
/* skip LINK_DUPLICATES */
|
||||
if ((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)
|
||||
@@ -761,6 +794,16 @@ 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
|
||||
else if (strcmp (name, _TEXT) == 0)
|
||||
{
|
||||
if (sec_flags & SEC_NEVER_LOAD)
|
||||
@@ -785,11 +828,13 @@ 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
|
||||
#ifdef COFF_LONG_SECTION_NAMES
|
||||
|| CONST_STRNEQ (name, GNU_LINKONCE_WI)
|
||||
|| CONST_STRNEQ (name, GNU_LINKONCE_WT)
|
||||
#endif
|
||||
|| CONST_STRNEQ (name, ".stab"))
|
||||
{
|
||||
@@ -947,7 +992,7 @@ handle_COMDAT (bfd * abfd,
|
||||
|
||||
if (! ((isym.n_sclass == C_STAT
|
||||
|| isym.n_sclass == C_EXT)
|
||||
&& isym.n_type == T_NULL
|
||||
&& BTYPE (isym.n_type) == T_NULL
|
||||
&& isym.n_value == 0))
|
||||
abort ();
|
||||
|
||||
@@ -1118,7 +1163,16 @@ styp_to_sec_flags (bfd *abfd,
|
||||
long styp_flags = internal_s->s_flags;
|
||||
flagword sec_flags;
|
||||
bfd_boolean result = TRUE;
|
||||
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)
|
||||
#endif
|
||||
|| CONST_STRNEQ (name, ".stab"))
|
||||
is_dbg = TRUE;
|
||||
/* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */
|
||||
sec_flags = SEC_READONLY;
|
||||
|
||||
@@ -1188,27 +1242,30 @@ styp_to_sec_flags (bfd *abfd,
|
||||
mean that a given section contains debug information. Thus
|
||||
we only set the SEC_DEBUGGING flag on sections that we
|
||||
recognise as containing debug information. */
|
||||
if (CONST_STRNEQ (name, DOT_DEBUG)
|
||||
if (is_dbg
|
||||
#ifdef _COMMENT
|
||||
|| strcmp (name, _COMMENT) == 0
|
||||
#endif
|
||||
#ifdef COFF_LONG_SECTION_NAMES
|
||||
|| CONST_STRNEQ (name, GNU_LINKONCE_WI)
|
||||
#endif
|
||||
|| CONST_STRNEQ (name, ".stab"))
|
||||
sec_flags |= SEC_DEBUGGING;
|
||||
)
|
||||
{
|
||||
sec_flags |= SEC_DEBUGGING | SEC_READONLY;
|
||||
}
|
||||
break;
|
||||
case IMAGE_SCN_MEM_SHARED:
|
||||
sec_flags |= SEC_COFF_SHARED;
|
||||
break;
|
||||
case IMAGE_SCN_LNK_REMOVE:
|
||||
sec_flags |= SEC_EXCLUDE;
|
||||
if (!is_dbg)
|
||||
sec_flags |= SEC_EXCLUDE;
|
||||
break;
|
||||
case IMAGE_SCN_CNT_CODE:
|
||||
sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
|
||||
break;
|
||||
case IMAGE_SCN_CNT_INITIALIZED_DATA:
|
||||
sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
|
||||
if (is_dbg)
|
||||
sec_flags |= SEC_DEBUGGING;
|
||||
else
|
||||
sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
|
||||
break;
|
||||
case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
|
||||
sec_flags |= SEC_ALLOC;
|
||||
@@ -1332,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;
|
||||
@@ -1690,6 +1747,7 @@ coff_new_section_hook (bfd * abfd, asection * section)
|
||||
{
|
||||
combined_entry_type *native;
|
||||
bfd_size_type amt;
|
||||
unsigned char sclass = C_STAT;
|
||||
|
||||
section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
|
||||
|
||||
@@ -1697,9 +1755,22 @@ coff_new_section_hook (bfd * abfd, asection * section)
|
||||
if (bfd_xcoff_text_align_power (abfd) != 0
|
||||
&& strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
|
||||
section->alignment_power = bfd_xcoff_text_align_power (abfd);
|
||||
if (bfd_xcoff_data_align_power (abfd) != 0
|
||||
else if (bfd_xcoff_data_align_power (abfd) != 0
|
||||
&& strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
|
||||
section->alignment_power = bfd_xcoff_data_align_power (abfd);
|
||||
else
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
|
||||
if (strcmp (bfd_get_section_name (abfd, section),
|
||||
xcoff_dwsect_names[i].name) == 0)
|
||||
{
|
||||
section->alignment_power = 0;
|
||||
sclass = C_DWARF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set up the section symbol. */
|
||||
@@ -1723,7 +1794,7 @@ coff_new_section_hook (bfd * abfd, asection * section)
|
||||
for n_numaux is already correct. */
|
||||
|
||||
native->u.syment.n_type = T_NULL;
|
||||
native->u.syment.n_sclass = C_STAT;
|
||||
native->u.syment.n_sclass = sclass;
|
||||
|
||||
coffsymbol (section->symbol)->native = native;
|
||||
|
||||
@@ -1836,12 +1907,14 @@ coff_set_alignment_hook (bfd * abfd ATTRIBUTE_UNUSED,
|
||||
file_ptr oldpos = bfd_tell (abfd);
|
||||
bfd_size_type relsz = bfd_coff_relsz (abfd);
|
||||
|
||||
bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0);
|
||||
if (bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0) != 0)
|
||||
return;
|
||||
if (bfd_bread (& dst, relsz, abfd) != relsz)
|
||||
return;
|
||||
|
||||
coff_swap_reloc_in (abfd, &dst, &n);
|
||||
bfd_seek (abfd, oldpos, 0);
|
||||
if (bfd_seek (abfd, oldpos, 0) != 0)
|
||||
return;
|
||||
section->reloc_count = hdr->s_nreloc = n.r_vaddr - 1;
|
||||
section->rel_filepos += relsz;
|
||||
}
|
||||
@@ -2092,22 +2165,6 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
|
||||
machine = bfd_mach_m68020;
|
||||
break;
|
||||
#endif
|
||||
#ifdef MAXQ20MAGIC
|
||||
case MAXQ20MAGIC:
|
||||
arch = bfd_arch_maxq;
|
||||
switch (internal_f->f_flags & F_MACHMASK)
|
||||
{
|
||||
case F_MAXQ10:
|
||||
machine = bfd_mach_maxq10;
|
||||
break;
|
||||
case F_MAXQ20:
|
||||
machine = bfd_mach_maxq20;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef MC88MAGIC
|
||||
case MC88MAGIC:
|
||||
case MC88DMAGIC:
|
||||
@@ -2646,7 +2703,7 @@ coff_write_relocs (bfd * abfd, int first_undef)
|
||||
entries know which symbol index they point to. So we
|
||||
have to look up the output symbol here. */
|
||||
|
||||
if (q->sym_ptr_ptr[0]->the_bfd != abfd)
|
||||
if (q->sym_ptr_ptr[0] != NULL && q->sym_ptr_ptr[0]->the_bfd != abfd)
|
||||
{
|
||||
int j;
|
||||
const char *sname = q->sym_ptr_ptr[0]->name;
|
||||
@@ -2675,7 +2732,7 @@ coff_write_relocs (bfd * abfd, int first_undef)
|
||||
n.r_symndx = q->addend;
|
||||
else
|
||||
#endif
|
||||
if (q->sym_ptr_ptr)
|
||||
if (q->sym_ptr_ptr && q->sym_ptr_ptr[0] != NULL)
|
||||
{
|
||||
#ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
|
||||
if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q, s))
|
||||
@@ -3016,17 +3073,6 @@ coff_set_flags (bfd * abfd,
|
||||
return TRUE;
|
||||
#endif
|
||||
|
||||
#ifdef MAXQ20MAGIC
|
||||
case bfd_arch_maxq:
|
||||
* magicp = MAXQ20MAGIC;
|
||||
switch (bfd_get_mach (abfd))
|
||||
{
|
||||
case bfd_mach_maxq10: * flagsp = F_MAXQ10; return TRUE;
|
||||
case bfd_mach_maxq20: * flagsp = F_MAXQ20; return TRUE;
|
||||
default: return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
default: /* Unknown architecture. */
|
||||
/* Fall through to "return FALSE" below, to avoid
|
||||
"statement never reached" errors on the one below. */
|
||||
@@ -3088,13 +3134,34 @@ static bfd_boolean
|
||||
coff_compute_section_file_positions (bfd * abfd)
|
||||
{
|
||||
asection *current;
|
||||
asection *previous = NULL;
|
||||
file_ptr sofar = bfd_coff_filhsz (abfd);
|
||||
bfd_boolean align_adjust;
|
||||
int target_index;
|
||||
#ifdef ALIGN_SECTIONS_IN_FILE
|
||||
asection *previous = NULL;
|
||||
file_ptr old_sofar;
|
||||
#endif
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
int page_size;
|
||||
|
||||
if (coff_data (abfd)->link_info)
|
||||
{
|
||||
page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
|
||||
|
||||
/* If no file alignment has been set, default to one.
|
||||
This repairs 'ld -r' for arm-wince-pe target. */
|
||||
if (page_size == 0)
|
||||
page_size = 1;
|
||||
}
|
||||
else
|
||||
page_size = PE_DEF_FILE_ALIGNMENT;
|
||||
#else
|
||||
#ifdef COFF_PAGE_SIZE
|
||||
int page_size = COFF_PAGE_SIZE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef RS6000COFF_C
|
||||
/* On XCOFF, if we have symbols, set up the .debug section. */
|
||||
if (bfd_get_symcount (abfd) > 0)
|
||||
@@ -3134,26 +3201,6 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
int page_size;
|
||||
|
||||
if (coff_data (abfd)->link_info)
|
||||
{
|
||||
page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
|
||||
|
||||
/* If no file alignment has been set, default to one.
|
||||
This repairs 'ld -r' for arm-wince-pe target. */
|
||||
if (page_size == 0)
|
||||
page_size = 1;
|
||||
}
|
||||
else
|
||||
page_size = PE_DEF_FILE_ALIGNMENT;
|
||||
#else
|
||||
#ifdef COFF_PAGE_SIZE
|
||||
int page_size = COFF_PAGE_SIZE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (bfd_get_start_address (abfd))
|
||||
/* A start address may have been added to the original file. In this
|
||||
case it will need an optional header to record it. */
|
||||
@@ -3189,7 +3236,6 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
unsigned int count;
|
||||
asection **section_list;
|
||||
unsigned int i;
|
||||
int target_index;
|
||||
bfd_size_type amt;
|
||||
|
||||
#ifdef COFF_PAGE_SIZE
|
||||
@@ -3252,14 +3298,20 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
#else /* ! COFF_IMAGE_WITH_PE */
|
||||
{
|
||||
/* Set the target_index field. */
|
||||
int target_index;
|
||||
|
||||
target_index = 1;
|
||||
for (current = abfd->sections; current != NULL; current = current->next)
|
||||
current->target_index = target_index++;
|
||||
}
|
||||
#endif /* ! COFF_IMAGE_WITH_PE */
|
||||
|
||||
if (target_index >= 32768)
|
||||
{
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
(*_bfd_error_handler)
|
||||
(_("%B: too many sections (%d)"), abfd, target_index);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
align_adjust = FALSE;
|
||||
for (current = abfd->sections;
|
||||
current != NULL;
|
||||
@@ -3292,6 +3344,8 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
if (!(current->flags & SEC_HAS_CONTENTS))
|
||||
continue;
|
||||
|
||||
current->rawsize = current->size;
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
/* Make sure we skip empty sections in a PE image. */
|
||||
if (current->size == 0)
|
||||
@@ -3309,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;
|
||||
bfd_vma align = 4096;
|
||||
bfd_vma sofar_off = sofar % align;
|
||||
bfd_vma vma_off = current->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);
|
||||
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)
|
||||
@@ -3358,7 +3414,7 @@ coff_compute_section_file_positions (bfd * abfd)
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
/* Set the padded size. */
|
||||
current->size = (current->size + page_size -1) & -page_size;
|
||||
current->size = (current->size + page_size - 1) & -page_size;
|
||||
#endif
|
||||
|
||||
sofar += current->size;
|
||||
@@ -3397,10 +3453,12 @@ 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
|
||||
previous = current;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* It is now safe to write to the output file. If we needed an
|
||||
@@ -3525,7 +3583,9 @@ coff_write_object_contents (bfd * abfd)
|
||||
asection *current;
|
||||
bfd_boolean hasrelocs = FALSE;
|
||||
bfd_boolean haslinno = FALSE;
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
bfd_boolean hasdebug = FALSE;
|
||||
#endif
|
||||
file_ptr scn_base;
|
||||
file_ptr reloc_base;
|
||||
file_ptr lineno_base;
|
||||
@@ -3628,9 +3688,9 @@ coff_write_object_contents (bfd * abfd)
|
||||
current = current->next)
|
||||
{
|
||||
struct internal_scnhdr section;
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
bfd_boolean is_reloc_section = FALSE;
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
if (strcmp (current->name, DOT_RELOC) == 0)
|
||||
{
|
||||
is_reloc_section = TRUE;
|
||||
@@ -3729,9 +3789,11 @@ coff_write_object_contents (bfd * abfd)
|
||||
#endif
|
||||
if (current->lineno_count != 0)
|
||||
haslinno = TRUE;
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
if ((current->flags & SEC_DEBUGGING) != 0
|
||||
&& ! is_reloc_section)
|
||||
hasdebug = TRUE;
|
||||
#endif
|
||||
|
||||
#ifdef RS6000COFF_C
|
||||
#ifndef XCOFF64
|
||||
@@ -3893,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;
|
||||
@@ -4097,11 +4159,6 @@ coff_write_object_contents (bfd * abfd)
|
||||
internal_a.magic = NMAGIC; /* Assume separate i/d. */
|
||||
#endif
|
||||
|
||||
#ifdef MAXQ20MAGIC
|
||||
#define __A_MAGIC_SET__
|
||||
internal_a.magic = MAXQ20MAGIC;
|
||||
#endif
|
||||
|
||||
#ifndef __A_MAGIC_SET__
|
||||
#include "Your aouthdr magic number is not being set!"
|
||||
#else
|
||||
@@ -4505,7 +4562,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%B: warning: illegal symbol index %ld in line numbers"),
|
||||
abfd, dst.l_addr.l_symndx);
|
||||
abfd, (long) symndx);
|
||||
symndx = 0;
|
||||
warned = TRUE;
|
||||
}
|
||||
@@ -4743,6 +4800,10 @@ coff_slurp_symbol_table (bfd * abfd)
|
||||
case C_THUMBSTAT: /* Thumb static. */
|
||||
case C_THUMBLABEL: /* Thumb label. */
|
||||
case C_THUMBSTATFUNC:/* Thumb static function. */
|
||||
#endif
|
||||
#ifdef RS6000COFF_C
|
||||
case C_DWARF: /* A label in a dwarf section. */
|
||||
case C_INFO: /* A label in a comment section. */
|
||||
#endif
|
||||
case C_LABEL: /* Label. */
|
||||
if (src->u.syment.n_scnum == N_DEBUG)
|
||||
@@ -4848,7 +4909,7 @@ coff_slurp_symbol_table (bfd * abfd)
|
||||
to the symbol instead of the index. FIXME: This
|
||||
should use a union. */
|
||||
src->u.syment.n_value =
|
||||
(long) (native_symbols + src->u.syment.n_value);
|
||||
(long) (intptr_t) (native_symbols + src->u.syment.n_value);
|
||||
dst->symbol.value = src->u.syment.n_value;
|
||||
src->fix_value = 1;
|
||||
break;
|
||||
@@ -4890,6 +4951,11 @@ coff_slurp_symbol_table (bfd * abfd)
|
||||
&& src->u.syment.n_value == 0
|
||||
&& src->u.syment.n_scnum == 0)
|
||||
break;
|
||||
#ifdef RS6000COFF_C
|
||||
/* XCOFF specific: deleted entry. */
|
||||
if (src->u.syment.n_value == C_NULL_VALUE)
|
||||
break;
|
||||
#endif
|
||||
/* Fall through. */
|
||||
case C_EXTDEF: /* External definition. */
|
||||
case C_ULABEL: /* Undefined label. */
|
||||
@@ -5141,7 +5207,7 @@ coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%B: warning: illegal symbol index %ld in relocs"),
|
||||
abfd, dst.r_symndx);
|
||||
abfd, (long) dst.r_symndx);
|
||||
cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||
ptr = NULL;
|
||||
}
|
||||
@@ -5167,6 +5233,7 @@ coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
|
||||
|
||||
/* Calculate any reloc addend by looking at the symbol. */
|
||||
CALC_ADDEND (abfd, ptr, dst, cache_ptr);
|
||||
(void) ptr;
|
||||
|
||||
cache_ptr->address -= asect->vma;
|
||||
/* !! cache_ptr->section = NULL;*/
|
||||
@@ -5326,6 +5393,8 @@ dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
#endif /* ! defined (coff_relocate_section) */
|
||||
|
||||
#define coff_bfd_link_just_syms _bfd_generic_link_just_syms
|
||||
#define coff_bfd_copy_link_hash_symbol_type \
|
||||
_bfd_generic_copy_link_hash_symbol_type
|
||||
#define coff_bfd_link_split_section _bfd_generic_link_split_section
|
||||
|
||||
#ifndef coff_start_final_link
|
||||
@@ -5600,6 +5669,10 @@ static bfd_coff_backend_data ticoff1_swap_table =
|
||||
#define coff_bfd_gc_sections bfd_generic_gc_sections
|
||||
#endif
|
||||
|
||||
#ifndef coff_bfd_lookup_section_flags
|
||||
#define coff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
|
||||
#endif
|
||||
|
||||
#ifndef coff_bfd_merge_sections
|
||||
#define coff_bfd_merge_sections bfd_generic_merge_sections
|
||||
#endif
|
||||
@@ -5614,7 +5687,7 @@ static bfd_coff_backend_data ticoff1_swap_table =
|
||||
|
||||
#ifndef coff_section_already_linked
|
||||
#define coff_section_already_linked \
|
||||
_bfd_generic_section_already_linked
|
||||
_bfd_coff_section_already_linked
|
||||
#endif
|
||||
|
||||
#ifndef coff_bfd_define_common_symbol
|
||||
@@ -5636,6 +5709,7 @@ const bfd_target VAR = \
|
||||
UNDER, /* Leading symbol underscore. */ \
|
||||
'/', /* AR_pad_char. */ \
|
||||
15, /* AR_max_namelen. */ \
|
||||
0, /* match priority. */ \
|
||||
\
|
||||
/* Data conversion functions. */ \
|
||||
bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
|
||||
@@ -5686,6 +5760,7 @@ const bfd_target VAR = \
|
||||
UNDER, /* Leading symbol underscore. */ \
|
||||
'/', /* AR_pad_char. */ \
|
||||
15, /* AR_max_namelen. */ \
|
||||
0, /* match priority. */ \
|
||||
\
|
||||
/* Data conversion functions. */ \
|
||||
bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
|
||||
@@ -5736,6 +5811,7 @@ const bfd_target VAR = \
|
||||
UNDER, /* Leading symbol underscore. */ \
|
||||
'/', /* AR_pad_char. */ \
|
||||
15, /* AR_max_namelen. */ \
|
||||
0, /* match priority. */ \
|
||||
\
|
||||
/* Data conversion functions. */ \
|
||||
bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
|
||||
|
||||
Reference in New Issue
Block a user