/* Support for the generic parts of most COFF variants, for BFD.
- Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
+ Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002
Free Software Foundation, Inc.
Written by Cygnus Support.
.
.typedef struct coff_ptr_struct
.{
+. {* Remembers the offset from the first symbol in the file for
+. this symbol. Generated by coff_renumber_symbols. *}
+. unsigned int offset;
.
-. {* Remembers the offset from the first symbol in the file for
-. this symbol. Generated by coff_renumber_symbols. *}
-.unsigned int offset;
+. {* Should the value of this symbol be renumbered. Used for
+. XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. *}
+. unsigned int fix_value : 1;
.
-. {* Should the value of this symbol be renumbered. Used for
-. XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. *}
-.unsigned int fix_value : 1;
+. {* Should the tag field of this symbol be renumbered.
+. Created by coff_pointerize_aux. *}
+. unsigned int fix_tag : 1;
.
-. {* Should the tag field of this symbol be renumbered.
-. Created by coff_pointerize_aux. *}
-.unsigned int fix_tag : 1;
+. {* Should the endidx field of this symbol be renumbered.
+. Created by coff_pointerize_aux. *}
+. unsigned int fix_end : 1;
.
-. {* Should the endidx field of this symbol be renumbered.
-. Created by coff_pointerize_aux. *}
-.unsigned int fix_end : 1;
+. {* Should the x_csect.x_scnlen field be renumbered.
+. Created by coff_pointerize_aux. *}
+. unsigned int fix_scnlen : 1;
.
-. {* Should the x_csect.x_scnlen field be renumbered.
-. Created by coff_pointerize_aux. *}
-.unsigned int fix_scnlen : 1;
+. {* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
+. index into the line number entries. Set by coff_slurp_symbol_table. *}
+. unsigned int fix_line : 1;
.
-. {* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
-. index into the line number entries. Set by
-. coff_slurp_symbol_table. *}
-.unsigned int fix_line : 1;
-.
-. {* The container for the symbol structure as read and translated
-. from the file. *}
-.
-.union {
-. union internal_auxent auxent;
-. struct internal_syment syment;
-. } u;
+. {* The container for the symbol structure as read and translated
+. from the file. *}
+. union
+. {
+. union internal_auxent auxent;
+. struct internal_syment syment;
+. } u;
.} combined_entry_type;
.
.
.
.typedef struct coff_symbol_struct
.{
-. {* The actual symbol which the rest of BFD works with *}
-.asymbol symbol;
+. {* The actual symbol which the rest of BFD works with *}
+. asymbol symbol;
.
-. {* A pointer to the hidden information for this symbol *}
-.combined_entry_type *native;
+. {* A pointer to the hidden information for this symbol *}
+. combined_entry_type *native;
.
-. {* A pointer to the linenumber information for this symbol *}
-.struct lineno_cache_entry *lineno;
+. {* A pointer to the linenumber information for this symbol *}
+. struct lineno_cache_entry *lineno;
.
-. {* Have the line numbers been relocated yet ? *}
-.boolean done_lineno;
+. {* Have the line numbers been relocated yet ? *}
+. bfd_boolean done_lineno;
.} coff_symbol_type;
*/
#define STRING_SIZE_SIZE (4)
-static long sec_to_styp_flags PARAMS ((const char *, flagword));
-static flagword styp_to_sec_flags
- PARAMS ((bfd *, PTR, const char *, asection *));
-static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
+static long sec_to_styp_flags
+ PARAMS ((const char *, flagword));
+static bfd_boolean styp_to_sec_flags
+ PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
+static bfd_boolean coff_bad_format_hook
+ PARAMS ((bfd *, PTR));
static void coff_set_custom_section_alignment
PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *,
const unsigned int));
-static boolean coff_new_section_hook PARAMS ((bfd *, asection *));
-static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR));
-static boolean coff_write_relocs PARAMS ((bfd *, int));
-static boolean coff_set_flags
+static bfd_boolean coff_new_section_hook
+ PARAMS ((bfd *, asection *));
+static bfd_boolean coff_set_arch_mach_hook
+ PARAMS ((bfd *, PTR));
+static bfd_boolean coff_write_relocs
+ PARAMS ((bfd *, int));
+static bfd_boolean coff_set_flags
PARAMS ((bfd *, unsigned int *, unsigned short *));
-static boolean coff_set_arch_mach
- PARAMS ((bfd *, enum bfd_architecture, unsigned long));
-static boolean coff_compute_section_file_positions PARAMS ((bfd *));
-static boolean coff_write_object_contents PARAMS ((bfd *));
-static boolean coff_set_section_contents
+static bfd_boolean coff_set_arch_mach
+ PARAMS ((bfd *, enum bfd_architecture, unsigned long)) ATTRIBUTE_UNUSED;
+static bfd_boolean coff_compute_section_file_positions
+ PARAMS ((bfd *));
+static bfd_boolean coff_write_object_contents
+ PARAMS ((bfd *)) ATTRIBUTE_UNUSED;
+static bfd_boolean coff_set_section_contents
PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
-static PTR buy_and_read PARAMS ((bfd *, file_ptr, int, size_t));
-static boolean coff_slurp_line_table PARAMS ((bfd *, asection *));
-static boolean coff_slurp_symbol_table PARAMS ((bfd *));
+static PTR buy_and_read
+ PARAMS ((bfd *, file_ptr, bfd_size_type));
+static bfd_boolean coff_slurp_line_table
+ PARAMS ((bfd *, asection *));
+static bfd_boolean coff_slurp_symbol_table
+ PARAMS ((bfd *));
static enum coff_symbol_classification coff_classify_symbol
PARAMS ((bfd *, struct internal_syment *));
-static boolean coff_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
+static bfd_boolean coff_slurp_reloc_table
+ PARAMS ((bfd *, asection *, asymbol **));
static long coff_canonicalize_reloc
PARAMS ((bfd *, asection *, arelent **, asymbol **));
#ifndef coff_mkobject_hook
-static PTR coff_mkobject_hook PARAMS ((bfd *, PTR, PTR));
+static PTR coff_mkobject_hook
+ PARAMS ((bfd *, PTR, PTR));
+#endif
+#ifdef COFF_WITH_PE
+static flagword handle_COMDAT
+ PARAMS ((bfd *, flagword, PTR, const char *, asection *));
+#endif
+#ifdef COFF_IMAGE_WITH_PE
+static bfd_boolean coff_read_word
+ PARAMS ((bfd *, unsigned int *));
+static unsigned int coff_compute_checksum
+ PARAMS ((bfd *));
+static bfd_boolean coff_apply_checksum
+ PARAMS ((bfd *));
#endif
\f
/* void warning(); */
#ifndef COFF_WITH_PE
+/* Macros for setting debugging flags. */
+#ifdef STYP_DEBUG
+#define STYP_XCOFF_DEBUG STYP_DEBUG
+#else
+#define STYP_XCOFF_DEBUG STYP_INFO
+#endif
+
+#ifdef COFF_ALIGN_IN_S_FLAGS
+#define STYP_DEBUG_INFO STYP_DSECT
+#else
+#define STYP_DEBUG_INFO STYP_INFO
+#endif
+
static long
sec_to_styp_flags (sec_name, sec_flags)
- CONST char *sec_name;
+ const char *sec_name;
flagword sec_flags;
{
long styp_flags = 0;
styp_flags = STYP_LIT;
#endif /* _LIT */
}
- else if (!strcmp (sec_name, ".debug"))
+ else if (!strncmp (sec_name, ".debug", 6))
{
-#ifdef STYP_DEBUG
- styp_flags = STYP_DEBUG;
-#else
- styp_flags = STYP_INFO;
-#endif
+ /* Handle the XCOFF debug section and DWARF2 debug sections. */
+ if (!sec_name[6])
+ styp_flags = STYP_XCOFF_DEBUG;
+ else
+ styp_flags = STYP_DEBUG_INFO;
}
else if (!strncmp (sec_name, ".stab", 5))
{
-#ifdef COFF_ALIGN_IN_S_FLAGS
- styp_flags = STYP_DSECT;
-#else
- styp_flags = STYP_INFO;
-#endif
+ styp_flags = STYP_DEBUG_INFO;
+ }
+#ifdef COFF_LONG_SECTION_NAMES
+ else if (!strncmp (sec_name, ".gnu.linkonce.wi.", 17))
+ {
+ styp_flags = STYP_DEBUG_INFO;
}
+#endif
#ifdef RS6000COFF_C
else if (!strcmp (sec_name, _PAD))
{
{
styp_flags = STYP_LOADER;
}
+ else if (!strcmp (sec_name, _EXCEPT))
+ {
+ styp_flags = STYP_EXCEPT;
+ }
+ else if (!strcmp (sec_name, _TYPCHK))
+ {
+ styp_flags = STYP_TYPCHK;
+ }
#endif
/* Try and figure out what it should be */
else if (sec_flags & SEC_CODE)
if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */
/* skip ROM */
- /* skip CONSTRUCTOR */
+ /* skip constRUCTOR */
/* skip CONTENTS */
#ifdef STYP_NOLOAD
if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
#ifndef COFF_WITH_PE
-static flagword
-styp_to_sec_flags (abfd, hdr, name, section)
+static bfd_boolean
+styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
bfd *abfd ATTRIBUTE_UNUSED;
PTR hdr;
const char *name;
asection *section ATTRIBUTE_UNUSED;
+ flagword *flags_ptr;
{
struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
long styp_flags = internal_s->s_flags;
#ifdef STYP_BLOCK
if (styp_flags & STYP_BLOCK)
- sec_flags |= SEC_BLOCK;
+ sec_flags |= SEC_BLOCK;
#endif
#ifdef STYP_CLINK
if (styp_flags & STYP_CLINK)
- sec_flags |= SEC_CLINK;
+ sec_flags |= SEC_CLINK;
#endif
#ifdef STYP_NOLOAD
if (styp_flags & STYP_NOLOAD)
- {
- sec_flags |= SEC_NEVER_LOAD;
- }
+ sec_flags |= SEC_NEVER_LOAD;
#endif /* STYP_NOLOAD */
/* For 386 COFF, at least, an unloadable text or data section is
#endif
}
else if (styp_flags & STYP_PAD)
- {
- sec_flags = 0;
- }
+ sec_flags = 0;
else if (strcmp (name, _TEXT) == 0)
{
if (sec_flags & SEC_NEVER_LOAD)
#endif
sec_flags |= SEC_ALLOC;
}
- else if (strcmp (name, ".debug") == 0
+ else if (strncmp (name, ".debug", 6) == 0
#ifdef _COMMENT
|| strcmp (name, _COMMENT) == 0
+#endif
+#ifdef COFF_LONG_SECTION_NAMES
+ || strncmp (name, ".gnu.linkonce.wi.", 17) == 0
#endif
|| strncmp (name, ".stab", 5) == 0)
{
#endif
#ifdef _LIT
else if (strcmp (name, _LIT) == 0)
- {
- sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
- }
+ sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
#endif
else
- {
- sec_flags |= SEC_ALLOC | SEC_LOAD;
- }
+ sec_flags |= SEC_ALLOC | SEC_LOAD;
#ifdef STYP_LIT /* A29k readonly text/data section type */
if ((styp_flags & STYP_LIT) == STYP_LIT)
- {
- sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
- }
+ sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
#endif /* STYP_LIT */
+
#ifdef STYP_OTHER_LOAD /* Other loaded sections */
if (styp_flags & STYP_OTHER_LOAD)
- {
- sec_flags = (SEC_LOAD | SEC_ALLOC);
- }
+ sec_flags = (SEC_LOAD | SEC_ALLOC);
#endif /* STYP_SDATA */
#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
#endif
- return sec_flags;
+ if (flags_ptr == NULL)
+ return FALSE;
+
+ * flags_ptr = sec_flags;
+ return TRUE;
}
#else /* COFF_WITH_PE */
-/* The PE version; see above for the general comments.
-
- Since to set the SEC_LINK_ONCE and associated flags, we have to
- look at the symbol table anyway, we return the symbol table index
- of the symbol being used as the COMDAT symbol. This is admittedly
- ugly, but there's really nowhere else that we have access to the
- required information. FIXME: Is the COMDAT symbol index used for
- any purpose other than objdump? */
-
static flagword
-styp_to_sec_flags (abfd, hdr, name, section)
- bfd *abfd ATTRIBUTE_UNUSED;
+handle_COMDAT (abfd, sec_flags, hdr, name, section)
+ bfd * abfd;
+ flagword sec_flags;
PTR hdr;
const char *name;
asection *section;
{
struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
- long styp_flags = internal_s->s_flags;
- flagword sec_flags = 0;
+ bfd_byte *esymstart, *esym, *esymend;
+ int seen_state = 0;
+ char *target_name = NULL;
- if (styp_flags & STYP_DSECT)
- abort (); /* Don't know what to do */
-#ifdef SEC_NEVER_LOAD
- if (styp_flags & STYP_NOLOAD)
- sec_flags |= SEC_NEVER_LOAD;
-#endif
- if (styp_flags & STYP_GROUP)
- abort (); /* Don't know what to do */
- /* skip IMAGE_SCN_TYPE_NO_PAD */
- if (styp_flags & STYP_COPY)
- abort (); /* Don't know what to do */
- if (styp_flags & IMAGE_SCN_CNT_CODE)
- sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
- if (styp_flags & IMAGE_SCN_CNT_INITIALIZED_DATA)
- sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
- if (styp_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
- sec_flags |= SEC_ALLOC;
- if (styp_flags & IMAGE_SCN_LNK_OTHER)
- abort (); /* Don't know what to do */
- if (styp_flags & IMAGE_SCN_LNK_INFO)
- {
- /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
- defined. coff_compute_section_file_positions uses
- COFF_PAGE_SIZE to ensure that the low order bits of the
- section VMA and the file offset match. If we don't know
- COFF_PAGE_SIZE, we can't ensure the correct correspondence,
- and demand page loading of the file will fail. */
-#ifdef COFF_PAGE_SIZE
- sec_flags |= SEC_DEBUGGING;
-#endif
- }
- if (styp_flags & STYP_OVER)
- abort (); /* Don't know what to do */
- if (styp_flags & IMAGE_SCN_LNK_REMOVE)
- sec_flags |= SEC_EXCLUDE;
-
- if (styp_flags & IMAGE_SCN_MEM_SHARED)
- sec_flags |= SEC_SHARED;
- /* COMDAT: see below */
- if (styp_flags & IMAGE_SCN_MEM_DISCARDABLE)
- sec_flags |= SEC_DEBUGGING;
- if (styp_flags & IMAGE_SCN_MEM_NOT_CACHED)
- abort ();/* Don't know what to do */
- if (styp_flags & IMAGE_SCN_MEM_NOT_PAGED)
- abort (); /* Don't know what to do */
-
- /* We infer from the distinct read/write/execute bits the settings
- of some of the bfd flags; the actual values, should we need them,
- are also in pei_section_data (abfd, section)->pe_flags. */
-
- if (styp_flags & IMAGE_SCN_MEM_EXECUTE)
- sec_flags |= SEC_CODE; /* Probably redundant */
- /* IMAGE_SCN_MEM_READ is simply ignored, assuming it always to be true. */
- if ((styp_flags & IMAGE_SCN_MEM_WRITE) == 0)
- sec_flags |= SEC_READONLY;
-
- /* COMDAT gets very special treatment. */
- if (styp_flags & IMAGE_SCN_LNK_COMDAT)
+ sec_flags |= SEC_LINK_ONCE;
+
+ /* Unfortunately, the PE format stores essential information in
+ the symbol table, of all places. We need to extract that
+ information now, so that objdump and the linker will know how
+ to handle the section without worrying about the symbols. We
+ can't call slurp_symtab, because the linker doesn't want the
+ swapped symbols. */
+
+ /* COMDAT sections are special. The first symbol is the section
+ symbol, which tells what kind of COMDAT section it is. The
+ second symbol is the "comdat symbol" - the one with the
+ unique name. GNU uses the section symbol for the unique
+ name; MS uses ".text" for every comdat section. Sigh. - DJ */
+
+ /* This is not mirrored in sec_to_styp_flags(), but there
+ doesn't seem to be a need to, either, and it would at best be
+ rather messy. */
+
+ if (! _bfd_coff_get_external_symbols (abfd))
+ return sec_flags;
+
+ esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
+ esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
+
+ while (esym < esymend)
{
- sec_flags |= SEC_LINK_ONCE;
-
- /* Unfortunately, the PE format stores essential information in
- the symbol table, of all places. We need to extract that
- information now, so that objdump and the linker will know how
- to handle the section without worrying about the symbols. We
- can't call slurp_symtab, because the linker doesn't want the
- swapped symbols. */
-
- /* COMDAT sections are special. The first symbol is the section
- symbol, which tells what kind of COMDAT section it is. The
- second symbol is the "comdat symbol" - the one with the
- unique name. GNU uses the section symbol for the unique
- name; MS uses ".text" for every comdat section. Sigh. - DJ */
-
- /* This is not mirrored in sec_to_styp_flags(), but there
- doesn't seem to be a need to, either, and it would at best be
- rather messy. */
-
- if (_bfd_coff_get_external_symbols (abfd))
+ struct internal_syment isym;
+ char buf[SYMNMLEN + 1];
+ const char *symname;
+
+ bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
+
+ if (sizeof (internal_s->s_name) > SYMNMLEN)
{
- bfd_byte *esymstart, *esym, *esymend;
- int seen_state = 0;
- char *target_name = NULL;
+ /* This case implies that the matching
+ symbol name will be in the string table. */
+ abort ();
+ }
- esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
- esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
+ if (isym.n_scnum == section->target_index)
+ {
+ /* According to the MSVC documentation, the first
+ TWO entries with the section # are both of
+ interest to us. The first one is the "section
+ symbol" (section name). The second is the comdat
+ symbol name. Here, we've found the first
+ qualifying entry; we distinguish it from the
+ second with a state flag.
+
+ In the case of gas-generated (at least until that
+ is fixed) .o files, it isn't necessarily the
+ second one. It may be some other later symbol.
+
+ Since gas also doesn't follow MS conventions and
+ emits the section similar to .text$<name>, where
+ <something> is the name we're looking for, we
+ distinguish the two as follows:
+
+ If the section name is simply a section name (no
+ $) we presume it's MS-generated, and look at
+ precisely the second symbol for the comdat name.
+ If the section name has a $, we assume it's
+ gas-generated, and look for <something> (whatever
+ follows the $) as the comdat symbol. */
+
+ /* All 3 branches use this */
+ symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
+
+ if (symname == NULL)
+ abort ();
- while (esym < esymend)
+ switch (seen_state)
{
- struct internal_syment isym;
- char buf[SYMNMLEN + 1];
- const char *symname;
+ case 0:
+ {
+ /* The first time we've seen the symbol. */
+ union internal_auxent aux;
+
+ seen_state = 1;
+
+ /* If it isn't the stuff we're expecting, die;
+ The MS documentation is vague, but it
+ appears that the second entry serves BOTH
+ as the comdat symbol and the defining
+ symbol record (either C_STAT or C_EXT,
+ possibly with an aux entry with debug
+ information if it's a function.) It
+ appears the only way to find the second one
+ is to count. (On Intel, they appear to be
+ adjacent, but on Alpha, they have been
+ found separated.)
+
+ Here, we think we've found the first one,
+ but there's some checking we can do to be
+ sure. */
+
+ if (! (isym.n_sclass == C_STAT
+ && isym.n_type == T_NULL
+ && isym.n_value == 0))
+ abort ();
- bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
+ /* FIXME LATER: MSVC generates section names
+ like .text for comdats. Gas generates
+ names like .text$foo__Fv (in the case of a
+ function). See comment above for more. */
- if (sizeof (internal_s->s_name) > SYMNMLEN)
- {
- /* This case implies that the matching symbol name
- will be in the string table. */
+ if (strcmp (name, symname) != 0)
abort ();
- }
- if (isym.n_scnum == section->target_index)
- {
- /* According to the MSVC documentation, the first
- TWO entries with the section # are both of
- interest to us. The first one is the "section
- symbol" (section name). The second is the comdat
- symbol name. Here, we've found the first
- qualifying entry; we distinguish it from the
- second with a state flag.
-
- In the case of gas-generated (at least until that
- is fixed) .o files, it isn't necessarily the
- second one. It may be some other later symbol.
-
- Since gas also doesn't follow MS conventions and
- emits the section similar to .text$<name>, where
- <something> is the name we're looking for, we
- distinguish the two as follows:
-
- If the section name is simply a section name (no
- $) we presume it's MS-generated, and look at
- precisely the second symbol for the comdat name.
- If the section name has a $, we assume it's
- gas-generated, and look for <something> (whatever
- follows the $) as the comdat symbol. */
-
- /* All 3 branches use this */
- symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
-
- if (symname == NULL)
- abort ();
-
- switch (seen_state)
- {
- case 0:
- {
- /* The first time we've seen the symbol. */
- union internal_auxent aux;
-
- seen_state = 1;
-
- /* If it isn't the stuff we're expecting, die;
- The MS documentation is vague, but it
- appears that the second entry serves BOTH
- as the comdat symbol and the defining
- symbol record (either C_STAT or C_EXT,
- possibly with an aux entry with debug
- information if it's a function.) It
- appears the only way to find the second one
- is to count. (On Intel, they appear to be
- adjacent, but on Alpha, they have been
- found separated.)
-
- Here, we think we've found the first one,
- but there's some checking we can do to be
- sure. */
-
- if (! (isym.n_sclass == C_STAT
- && isym.n_type == T_NULL
- && isym.n_value == 0))
- abort ();
-
- /* FIXME LATER: MSVC generates section names
- like .text for comdats. Gas generates
- names like .text$foo__Fv (in the case of a
- function). See comment above for more. */
-
- if (strcmp (name, symname) != 0)
- abort ();
-
- /* This is the section symbol. */
-
- bfd_coff_swap_aux_in (abfd, (PTR) (esym + bfd_coff_symesz (abfd)),
- isym.n_type, isym.n_sclass,
- 0, isym.n_numaux, (PTR) &aux);
-
- target_name = strchr (name, '$');
- if (target_name != NULL)
- {
- /* Gas mode. */
- seen_state = 2;
- /* Skip the `$'. */
- target_name += 1;
- }
-
- /* FIXME: Microsoft uses NODUPLICATES and
- ASSOCIATIVE, but gnu uses ANY and
- SAME_SIZE. Unfortunately, gnu doesn't do
- the comdat symbols right. So, until we can
- fix it to do the right thing, we are
- temporarily disabling comdats for the MS
- types (they're used in DLLs and C++, but we
- don't support *their* C++ libraries anyway
- - DJ. */
-
- /* Cygwin does not follow the MS style, and
- uses ANY and SAME_SIZE where NODUPLICATES
- and ASSOCIATIVE should be used. For
- Interix, we just do the right thing up
- front. */
-
- switch (aux.x_scn.x_comdat)
- {
- case IMAGE_COMDAT_SELECT_NODUPLICATES:
+ /* This is the section symbol. */
+ bfd_coff_swap_aux_in (abfd, (PTR) (esym + bfd_coff_symesz (abfd)),
+ isym.n_type, isym.n_sclass,
+ 0, isym.n_numaux, (PTR) &aux);
+
+ target_name = strchr (name, '$');
+ if (target_name != NULL)
+ {
+ /* Gas mode. */
+ seen_state = 2;
+ /* Skip the `$'. */
+ target_name += 1;
+ }
+
+ /* FIXME: Microsoft uses NODUPLICATES and
+ ASSOCIATIVE, but gnu uses ANY and
+ SAME_SIZE. Unfortunately, gnu doesn't do
+ the comdat symbols right. So, until we can
+ fix it to do the right thing, we are
+ temporarily disabling comdats for the MS
+ types (they're used in DLLs and C++, but we
+ don't support *their* C++ libraries anyway
+ - DJ. */
+
+ /* Cygwin does not follow the MS style, and
+ uses ANY and SAME_SIZE where NODUPLICATES
+ and ASSOCIATIVE should be used. For
+ Interix, we just do the right thing up
+ front. */
+
+ switch (aux.x_scn.x_comdat)
+ {
+ case IMAGE_COMDAT_SELECT_NODUPLICATES:
#ifdef STRICT_PE_FORMAT
- sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
+ sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
#else
- sec_flags &= ~SEC_LINK_ONCE;
+ sec_flags &= ~SEC_LINK_ONCE;
#endif
- break;
+ break;
- case IMAGE_COMDAT_SELECT_ANY:
- sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
- break;
+ case IMAGE_COMDAT_SELECT_ANY:
+ sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+ break;
- case IMAGE_COMDAT_SELECT_SAME_SIZE:
- sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
- break;
+ case IMAGE_COMDAT_SELECT_SAME_SIZE:
+ sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
+ break;
- case IMAGE_COMDAT_SELECT_EXACT_MATCH:
- /* Not yet fully implemented ??? */
- sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
- break;
+ case IMAGE_COMDAT_SELECT_EXACT_MATCH:
+ /* Not yet fully implemented ??? */
+ sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
+ break;
- /* debug$S gets this case; other
- implications ??? */
+ /* debug$S gets this case; other
+ implications ??? */
- /* There may be no symbol... we'll search
- the whole table... Is this the right
- place to play this game? Or should we do
- it when reading it in. */
- case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
+ /* There may be no symbol... we'll search
+ the whole table... Is this the right
+ place to play this game? Or should we do
+ it when reading it in. */
+ case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
#ifdef STRICT_PE_FORMAT
- /* FIXME: This is not currently implemented. */
- sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+ /* FIXME: This is not currently implemented. */
+ sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
#else
- sec_flags &= ~SEC_LINK_ONCE;
+ sec_flags &= ~SEC_LINK_ONCE;
#endif
- break;
+ break;
- default: /* 0 means "no symbol" */
- /* debug$F gets this case; other
- implications ??? */
- sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
- break;
- }
- }
- break;
+ default: /* 0 means "no symbol" */
+ /* debug$F gets this case; other
+ implications ??? */
+ sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
+ break;
+ }
+ }
+ break;
- case 2:
- /* Gas mode: the first matching on partial name. */
+ case 2:
+ /* Gas mode: the first matching on partial name. */
#ifndef TARGET_UNDERSCORE
#define TARGET_UNDERSCORE 0
#endif
- /* Is this the name we're looking for? */
- if (strcmp (target_name,
- symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
- {
- /* Not the name we're looking for */
- esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
- continue;
- }
- /* Fall through. */
- case 1:
- /* MSVC mode: the lexically second symbol (or
- drop through from the above). */
- {
- char *newname;
-
- /* This must the the second symbol with the
- section #. It is the actual symbol name.
- Intel puts the two adjacent, but Alpha (at
- least) spreads them out. */
-
- section->comdat =
- bfd_alloc (abfd, sizeof (struct bfd_comdat_info));
- if (section->comdat == NULL)
- abort ();
- section->comdat->symbol =
- (esym - esymstart) / bfd_coff_symesz (abfd);
-
- newname = bfd_alloc (abfd, strlen (symname) + 1);
- if (newname == NULL)
- abort ();
-
- strcpy (newname, symname);
- section->comdat->name = newname;
-
- }
-
- goto breakloop;
- }
+ /* Is this the name we're looking for? */
+ if (strcmp (target_name,
+ symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
+ {
+ /* Not the name we're looking for */
+ esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
+ continue;
}
+ /* Fall through. */
+ case 1:
+ /* MSVC mode: the lexically second symbol (or
+ drop through from the above). */
+ {
+ char *newname;
+ bfd_size_type amt;
+
+ /* This must the second symbol with the
+ section #. It is the actual symbol name.
+ Intel puts the two adjacent, but Alpha (at
+ least) spreads them out. */
+
+ amt = sizeof (struct bfd_comdat_info);
+ section->comdat = bfd_alloc (abfd, amt);
+ if (section->comdat == NULL)
+ abort ();
+
+ section->comdat->symbol =
+ (esym - esymstart) / bfd_coff_symesz (abfd);
+
+ amt = strlen (symname) + 1;
+ newname = bfd_alloc (abfd, amt);
+ if (newname == NULL)
+ abort ();
+
+ strcpy (newname, symname);
+ section->comdat->name = newname;
+ }
- esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
+ goto breakloop;
}
- breakloop:
+ }
+
+ esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
+ }
+
+ breakloop:
+ return sec_flags;
+}
+
+
+/* The PE version; see above for the general comments.
+
+ Since to set the SEC_LINK_ONCE and associated flags, we have to
+ look at the symbol table anyway, we return the symbol table index
+ of the symbol being used as the COMDAT symbol. This is admittedly
+ ugly, but there's really nowhere else that we have access to the
+ required information. FIXME: Is the COMDAT symbol index used for
+ any purpose other than objdump? */
+
+static bfd_boolean
+styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
+ bfd *abfd;
+ PTR hdr;
+ const char *name;
+ asection *section;
+ flagword *flags_ptr;
+{
+ struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
+ long styp_flags = internal_s->s_flags;
+ flagword sec_flags;
+ bfd_boolean result = TRUE;
+
+ /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */
+ sec_flags = SEC_READONLY;
+
+ /* Process each flag bit in styp_flags in turn. */
+ while (styp_flags)
+ {
+ long flag = styp_flags & - styp_flags;
+ char * unhandled = NULL;
+
+ styp_flags &= ~ flag;
+
+ /* We infer from the distinct read/write/execute bits the settings
+ of some of the bfd flags; the actual values, should we need them,
+ are also in pei_section_data (abfd, section)->pe_flags. */
+
+ switch (flag)
+ {
+ case STYP_DSECT:
+ unhandled = "STYP_DSECT";
+ break;
+ case STYP_GROUP:
+ unhandled = "STYP_GROUP";
+ break;
+ case STYP_COPY:
+ unhandled = "STYP_COPY";
+ break;
+ case STYP_OVER:
+ unhandled = "STYP_OVER";
+ break;
+#ifdef SEC_NEVER_LOAD
+ case STYP_NOLOAD:
+ sec_flags |= SEC_NEVER_LOAD;
+ break;
+#endif
+ case IMAGE_SCN_MEM_READ:
+ /* Ignored, assume it always to be true. */
+ break;
+ case IMAGE_SCN_TYPE_NO_PAD:
+ /* Skip. */
+ break;
+ case IMAGE_SCN_LNK_OTHER:
+ unhandled = "IMAGE_SCN_LNK_OTHER";
+ break;
+ case IMAGE_SCN_MEM_NOT_CACHED:
+ unhandled = "IMAGE_SCN_MEM_NOT_CACHED";
+ break;
+ case IMAGE_SCN_MEM_NOT_PAGED:
+ unhandled = "IMAGE_SCN_MEM_NOT_PAGED";
+ break;
+ case IMAGE_SCN_MEM_EXECUTE:
+ sec_flags |= SEC_CODE;
+ break;
+ case IMAGE_SCN_MEM_WRITE:
+ sec_flags &= ~ SEC_READONLY;
+ break;
+ case IMAGE_SCN_MEM_DISCARDABLE:
+ sec_flags |= SEC_DEBUGGING;
+ break;
+ case IMAGE_SCN_MEM_SHARED:
+ sec_flags |= SEC_SHARED;
+ break;
+ case IMAGE_SCN_LNK_REMOVE:
+ 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;
+ break;
+ case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
+ sec_flags |= SEC_ALLOC;
+ break;
+ case IMAGE_SCN_LNK_INFO:
+ /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
+ defined. coff_compute_section_file_positions uses
+ COFF_PAGE_SIZE to ensure that the low order bits of the
+ section VMA and the file offset match. If we don't know
+ COFF_PAGE_SIZE, we can't ensure the correct correspondence,
+ and demand page loading of the file will fail. */
+#ifdef COFF_PAGE_SIZE
+ sec_flags |= SEC_DEBUGGING;
+#endif
+ break;
+ case IMAGE_SCN_LNK_COMDAT:
+ /* COMDAT gets very special treatment. */
+ sec_flags = handle_COMDAT (abfd, sec_flags, hdr, name, section);
+ break;
+ default:
+ /* Silently ignore for now. */
+ break;
+ }
+
+ /* If the section flag was not handled, report it here. */
+ if (unhandled != NULL)
+ {
+ (*_bfd_error_handler)
+ (_("%s (%s): Section flag %s (0x%x) ignored"),
+ bfd_archive_filename (abfd), name, unhandled, flag);
+ result = FALSE;
}
}
sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
#endif
- return sec_flags;
+ if (flags_ptr)
+ * flags_ptr = sec_flags;
+
+ return result;
}
#endif /* COFF_WITH_PE */
Special entry points for gdb to swap in coff symbol table parts:
.typedef struct
.{
-. void (*_bfd_coff_swap_aux_in) PARAMS ((
-. bfd *abfd,
-. PTR ext,
-. int type,
-. int class,
-. int indaux,
-. int numaux,
-. PTR in));
+. void (*_bfd_coff_swap_aux_in)
+. PARAMS ((bfd *, PTR, int, int, int, int, PTR));
.
-. void (*_bfd_coff_swap_sym_in) PARAMS ((
-. bfd *abfd ,
-. PTR ext,
-. PTR in));
+. void (*_bfd_coff_swap_sym_in)
+. PARAMS ((bfd *, PTR, PTR));
.
-. void (*_bfd_coff_swap_lineno_in) PARAMS ((
-. bfd *abfd,
-. PTR ext,
-. PTR in));
+. void (*_bfd_coff_swap_lineno_in)
+. PARAMS ((bfd *, PTR, PTR));
.
-
-Special entry points for gas to swap out coff parts:
-
-. unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
-. bfd *abfd,
-. PTR in,
-. int type,
-. int class,
-. int indaux,
-. int numaux,
-. PTR ext));
+. unsigned int (*_bfd_coff_swap_aux_out)
+. PARAMS ((bfd *, PTR, int, int, int, int, PTR));
.
-. unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
-. bfd *abfd,
-. PTR in,
-. PTR ext));
+. unsigned int (*_bfd_coff_swap_sym_out)
+. PARAMS ((bfd *, PTR, PTR));
.
-. unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
-. bfd *abfd,
-. PTR in,
-. PTR ext));
+. unsigned int (*_bfd_coff_swap_lineno_out)
+. PARAMS ((bfd *, PTR, PTR));
.
-. unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
-. bfd *abfd,
-. PTR src,
-. PTR dst));
+. unsigned int (*_bfd_coff_swap_reloc_out)
+. PARAMS ((bfd *, PTR, PTR));
.
-. unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
-. bfd *abfd,
-. PTR in,
-. PTR out));
+. unsigned int (*_bfd_coff_swap_filehdr_out)
+. PARAMS ((bfd *, PTR, PTR));
.
-. unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
-. bfd *abfd,
-. PTR in,
-. PTR out));
+. unsigned int (*_bfd_coff_swap_aouthdr_out)
+. PARAMS ((bfd *, PTR, PTR));
.
-. unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
-. bfd *abfd,
-. PTR in,
-. PTR out));
+. unsigned int (*_bfd_coff_swap_scnhdr_out)
+. PARAMS ((bfd *, PTR, PTR));
.
-
-Special entry points for generic COFF routines to call target
-dependent COFF routines:
-
-. unsigned int _bfd_filhsz;
-. unsigned int _bfd_aoutsz;
-. unsigned int _bfd_scnhsz;
-. unsigned int _bfd_symesz;
-. unsigned int _bfd_auxesz;
-. unsigned int _bfd_relsz;
-. unsigned int _bfd_linesz;
-. unsigned int _bfd_filnmlen;
-. boolean _bfd_coff_long_filenames;
-. boolean _bfd_coff_long_section_names;
-. unsigned int _bfd_coff_default_section_alignment_power;
-. boolean _bfd_coff_force_symnames_in_strings;
-. unsigned int _bfd_coff_debug_string_prefix_length;
-. void (*_bfd_coff_swap_filehdr_in) PARAMS ((
-. bfd *abfd,
-. PTR ext,
-. PTR in));
-. void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
-. bfd *abfd,
-. PTR ext,
-. PTR in));
-. void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
-. bfd *abfd,
-. PTR ext,
-. PTR in));
-. void (*_bfd_coff_swap_reloc_in) PARAMS ((
-. bfd *abfd,
-. PTR ext,
-. PTR in));
-. boolean (*_bfd_coff_bad_format_hook) PARAMS ((
-. bfd *abfd,
-. PTR internal_filehdr));
-. boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
-. bfd *abfd,
-. PTR internal_filehdr));
-. PTR (*_bfd_coff_mkobject_hook) PARAMS ((
-. bfd *abfd,
-. PTR internal_filehdr,
-. PTR internal_aouthdr));
-. flagword (*_bfd_styp_to_sec_flags_hook) PARAMS ((
-. bfd *abfd,
-. PTR internal_scnhdr,
-. const char *name,
-. asection *section));
-. void (*_bfd_set_alignment_hook) PARAMS ((
-. bfd *abfd,
-. asection *sec,
-. PTR internal_scnhdr));
-. boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
-. bfd *abfd));
-. boolean (*_bfd_coff_symname_in_debug) PARAMS ((
-. bfd *abfd,
-. struct internal_syment *sym));
-. boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
-. bfd *abfd,
-. combined_entry_type *table_base,
-. combined_entry_type *symbol,
-. unsigned int indaux,
-. combined_entry_type *aux));
-. boolean (*_bfd_coff_print_aux) PARAMS ((
-. bfd *abfd,
-. FILE *file,
-. combined_entry_type *table_base,
-. combined_entry_type *symbol,
-. combined_entry_type *aux,
-. unsigned int indaux));
-. void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
-. bfd *abfd,
-. struct bfd_link_info *link_info,
-. struct bfd_link_order *link_order,
-. arelent *reloc,
-. bfd_byte *data,
-. unsigned int *src_ptr,
-. unsigned int *dst_ptr));
-. int (*_bfd_coff_reloc16_estimate) PARAMS ((
-. bfd *abfd,
-. asection *input_section,
-. arelent *r,
-. unsigned int shrink,
-. struct bfd_link_info *link_info));
-. enum coff_symbol_classification (*_bfd_coff_classify_symbol) PARAMS ((
-. bfd *abfd,
-. struct internal_syment *));
-. boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
-. bfd *abfd));
-. boolean (*_bfd_coff_start_final_link) PARAMS ((
-. bfd *output_bfd,
-. struct bfd_link_info *info));
-. boolean (*_bfd_coff_relocate_section) PARAMS ((
-. bfd *output_bfd,
-. struct bfd_link_info *info,
-. bfd *input_bfd,
-. asection *input_section,
-. bfd_byte *contents,
-. struct internal_reloc *relocs,
-. struct internal_syment *syms,
-. asection **sections));
-. reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
-. bfd *abfd,
-. asection *sec,
-. struct internal_reloc *rel,
-. struct coff_link_hash_entry *h,
-. struct internal_syment *sym,
-. bfd_vma *addendp));
-. boolean (*_bfd_coff_adjust_symndx) PARAMS ((
-. bfd *obfd,
-. struct bfd_link_info *info,
-. bfd *ibfd,
-. asection *sec,
-. struct internal_reloc *reloc,
-. boolean *adjustedp));
-. boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
-. struct bfd_link_info *info,
-. bfd *abfd,
-. const char *name,
-. flagword flags,
-. asection *section,
-. bfd_vma value,
-. const char *string,
-. boolean copy,
-. boolean collect,
-. struct bfd_link_hash_entry **hashp));
+. unsigned int _bfd_filhsz;
+. unsigned int _bfd_aoutsz;
+. unsigned int _bfd_scnhsz;
+. unsigned int _bfd_symesz;
+. unsigned int _bfd_auxesz;
+. unsigned int _bfd_relsz;
+. unsigned int _bfd_linesz;
+. unsigned int _bfd_filnmlen;
+. bfd_boolean _bfd_coff_long_filenames;
+. bfd_boolean _bfd_coff_long_section_names;
+. unsigned int _bfd_coff_default_section_alignment_power;
+. bfd_boolean _bfd_coff_force_symnames_in_strings;
+. unsigned int _bfd_coff_debug_string_prefix_length;
+.
+. void (*_bfd_coff_swap_filehdr_in)
+. PARAMS ((bfd *, PTR, PTR));
+.
+. void (*_bfd_coff_swap_aouthdr_in)
+. PARAMS ((bfd *, PTR, PTR));
+.
+. void (*_bfd_coff_swap_scnhdr_in)
+. PARAMS ((bfd *, PTR, PTR));
+.
+. void (*_bfd_coff_swap_reloc_in)
+. PARAMS ((bfd *abfd, PTR, PTR));
+.
+. bfd_boolean (*_bfd_coff_bad_format_hook)
+. PARAMS ((bfd *, PTR));
+.
+. bfd_boolean (*_bfd_coff_set_arch_mach_hook)
+. PARAMS ((bfd *, PTR));
+.
+. PTR (*_bfd_coff_mkobject_hook)
+. PARAMS ((bfd *, PTR, PTR));
+.
+. bfd_boolean (*_bfd_styp_to_sec_flags_hook)
+. PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
+.
+. void (*_bfd_set_alignment_hook)
+. PARAMS ((bfd *, asection *, PTR));
+.
+. bfd_boolean (*_bfd_coff_slurp_symbol_table)
+. PARAMS ((bfd *));
+.
+. bfd_boolean (*_bfd_coff_symname_in_debug)
+. PARAMS ((bfd *, struct internal_syment *));
+.
+. bfd_boolean (*_bfd_coff_pointerize_aux_hook)
+. PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
+. unsigned int, combined_entry_type *));
+.
+. bfd_boolean (*_bfd_coff_print_aux)
+. PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
+. combined_entry_type *, unsigned int));
+.
+. void (*_bfd_coff_reloc16_extra_cases)
+. PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
+. bfd_byte *, unsigned int *, unsigned int *));
+.
+. int (*_bfd_coff_reloc16_estimate)
+. PARAMS ((bfd *, asection *, arelent *, unsigned int,
+. struct bfd_link_info *));
+.
+. enum coff_symbol_classification (*_bfd_coff_classify_symbol)
+. PARAMS ((bfd *, struct internal_syment *));
+.
+. bfd_boolean (*_bfd_coff_compute_section_file_positions)
+. PARAMS ((bfd *));
.
-. boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
-. bfd * abfd,
-. struct coff_final_link_info * pfinfo));
-. boolean (*_bfd_coff_final_link_postscript) PARAMS ((
-. bfd * abfd,
-. struct coff_final_link_info * pfinfo));
+. bfd_boolean (*_bfd_coff_start_final_link)
+. PARAMS ((bfd *, struct bfd_link_info *));
+.
+. bfd_boolean (*_bfd_coff_relocate_section)
+. PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+. struct internal_reloc *, struct internal_syment *, asection **));
+.
+. reloc_howto_type *(*_bfd_coff_rtype_to_howto)
+. PARAMS ((bfd *, asection *, struct internal_reloc *,
+. struct coff_link_hash_entry *, struct internal_syment *,
+. bfd_vma *));
+.
+. bfd_boolean (*_bfd_coff_adjust_symndx)
+. PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
+. struct internal_reloc *, bfd_boolean *));
+.
+. bfd_boolean (*_bfd_coff_link_add_one_symbol)
+. PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword,
+. asection *, bfd_vma, const char *, bfd_boolean, bfd_boolean,
+. struct bfd_link_hash_entry **));
+.
+. bfd_boolean (*_bfd_coff_link_output_has_begun)
+. PARAMS ((bfd *, struct coff_final_link_info *));
+.
+. bfd_boolean (*_bfd_coff_final_link_postscript)
+. PARAMS ((bfd *, struct coff_final_link_info *));
.
.} bfd_coff_backend_data;
.
-.#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
+.#define coff_backend_info(abfd) \
+. ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
.
.#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
-. ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
+. ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
.
.#define bfd_coff_swap_sym_in(a,e,i) \
-. ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
+. ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
.
.#define bfd_coff_swap_lineno_in(a,e,i) \
-. ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
+. ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
.
.#define bfd_coff_swap_reloc_out(abfd, i, o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
.
.#define bfd_coff_swap_lineno_out(abfd, i, o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
.
.#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
-. ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
+. ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
.
.#define bfd_coff_swap_sym_out(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
.
.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
.
.#define bfd_coff_swap_filehdr_out(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
.
.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
.
.#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
.#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
.#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
.#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
.#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
-.#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
+.#define bfd_coff_long_filenames(abfd) \
+. (coff_backend_info (abfd)->_bfd_coff_long_filenames)
.#define bfd_coff_long_section_names(abfd) \
-. (coff_backend_info (abfd)->_bfd_coff_long_section_names)
+. (coff_backend_info (abfd)->_bfd_coff_long_section_names)
.#define bfd_coff_default_section_alignment_power(abfd) \
-. (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
+. (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
.#define bfd_coff_swap_filehdr_in(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
.
.#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
.
.#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
.
.#define bfd_coff_swap_reloc_in(abfd, i, o) \
-. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
+. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
.
.#define bfd_coff_bad_format_hook(abfd, filehdr) \
-. ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
+. ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
.
.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
-. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
+. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
-. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
+. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
.
-.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section)\
-. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
-. (abfd, scnhdr, name, section))
+.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
+. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
+. (abfd, scnhdr, name, section, flags_ptr))
.
.#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
-. ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
+. ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
.
.#define bfd_coff_slurp_symbol_table(abfd)\
-. ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
+. ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
.
.#define bfd_coff_symname_in_debug(abfd, sym)\
-. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
+. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
.
.#define bfd_coff_force_symnames_in_strings(abfd)\
-. (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
+. (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
.
.#define bfd_coff_debug_string_prefix_length(abfd)\
-. (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
+. (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
.
.#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
-. ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
-. (abfd, file, base, symbol, aux, indaux))
+. ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
+. (abfd, file, base, symbol, aux, indaux))
.
.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
-. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
-. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
+. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
+. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
.
.#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
-. ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
-. (abfd, section, reloc, shrink, link_info))
+. ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
+. (abfd, section, reloc, shrink, link_info))
.
.#define bfd_coff_classify_symbol(abfd, sym)\
-. ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
-. (abfd, sym))
+. ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
+. (abfd, sym))
.
.#define bfd_coff_compute_section_file_positions(abfd)\
-. ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
-. (abfd))
+. ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
+. (abfd))
.
.#define bfd_coff_start_final_link(obfd, info)\
-. ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
-. (obfd, info))
+. ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
+. (obfd, info))
.#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
-. ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
-. (obfd, info, ibfd, o, con, rel, isyms, secs))
+. ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
+. (obfd, info, ibfd, o, con, rel, isyms, secs))
.#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
-. ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
-. (abfd, sec, rel, h, sym, addendp))
+. ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
+. (abfd, sec, rel, h, sym, addendp))
.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
-. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
-. (obfd, info, ibfd, sec, rel, adjustedp))
+. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
+. (obfd, info, ibfd, sec, rel, adjustedp))
.#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\
-. ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
-. (info, abfd, name, flags, section, value, string, cp, coll, hashp))
+. ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
+. (info, abfd, name, flags, section, value, string, cp, coll, hashp))
.
.#define bfd_coff_link_output_has_begun(a,p) \
-. ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
+. ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
.#define bfd_coff_final_link_postscript(a,p) \
-. ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
+. ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
.
*/
/* See whether the magic number matches. */
-static boolean
+static bfd_boolean
coff_bad_format_hook (abfd, filehdr)
bfd * abfd ATTRIBUTE_UNUSED;
PTR filehdr;
struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
if (BADMAG (*internal_f))
- return false;
+ return FALSE;
/* if the optional header is NULL or not the correct size then
quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
#if defined(M88) || defined(I960)
if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr)
- return false;
+ return FALSE;
#endif
- return true;
+ return TRUE;
}
/* Check whether this section uses an alignment other than the
return;
if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
- && default_alignment > alignment_table[i].default_alignment_max)
+#if COFF_DEFAULT_SECTION_ALIGNMENT_POWER != 0
+ && default_alignment > alignment_table[i].default_alignment_max
+#endif
+ )
return;
section->alignment_power = alignment_table[i].alignment_power;
/* Initialize a section structure with information peculiar to this
particular implementation of COFF. */
-static boolean
+static bfd_boolean
coff_new_section_hook (abfd, section)
bfd * abfd;
asection * section;
{
combined_entry_type *native;
+ bfd_size_type amt;
section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
#ifdef RS6000COFF_C
- if (xcoff_data (abfd)->text_align_power != 0
+ if (bfd_xcoff_text_align_power (abfd) != 0
&& strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
- section->alignment_power = xcoff_data (abfd)->text_align_power;
- if (xcoff_data (abfd)->data_align_power != 0
+ section->alignment_power = bfd_xcoff_text_align_power (abfd);
+ if (bfd_xcoff_data_align_power (abfd) != 0
&& strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
- section->alignment_power = xcoff_data (abfd)->data_align_power;
+ section->alignment_power = bfd_xcoff_data_align_power (abfd);
#endif
/* Allocate aux records for section symbols, to store size and
@@ The 10 is a guess at a plausible maximum number of aux entries
(but shouldn't be a constant). */
- native = ((combined_entry_type *)
- bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
+ amt = sizeof (combined_entry_type) * 10;
+ native = (combined_entry_type *) bfd_zalloc (abfd, amt);
if (native == NULL)
- return false;
+ return FALSE;
/* We don't need to set up n_name, n_value, or n_scnum in the native
symbol information, since they'll be overriden by the BFD symbol
coff_section_alignment_table,
coff_section_alignment_table_size);
- return true;
+ return TRUE;
}
#ifdef COFF_ALIGN_IN_SECTION_HEADER
PTR scnhdr;
{
struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
+ bfd_size_type amt;
ALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6)
ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5)
mapped onto a generic BFD section bit. */
if (coff_section_data (abfd, section) == NULL)
{
- section->used_by_bfd =
- (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
+ amt = sizeof (struct coff_section_tdata);
+ section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
if (section->used_by_bfd == NULL)
{
/* FIXME: Return error. */
}
if (pei_section_data (abfd, section) == NULL)
{
- coff_section_data (abfd, section)->tdata =
- (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
+ amt = sizeof (struct pei_section_tdata);
+ coff_section_data (abfd, section)->tdata = (PTR) bfd_zalloc (abfd, amt);
if (coff_section_data (abfd, section)->tdata == NULL)
{
/* FIXME: Return error. */
{
struct external_reloc dst;
struct internal_reloc n;
- int oldpos = bfd_tell (abfd);
- bfd_seek (abfd, hdr->s_relptr, 0);
- if (bfd_read ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
+ file_ptr oldpos = bfd_tell (abfd);
+ bfd_seek (abfd, (file_ptr) hdr->s_relptr, 0);
+ if (bfd_bread ((PTR) &dst, (bfd_size_type) bfd_coff_relsz (abfd), abfd)
!= bfd_coff_relsz (abfd))
return;
coff_swap_reloc_in (abfd, &dst, &n);
bfd_seek (abfd, oldpos, 0);
- section->reloc_count =
- hdr->s_nreloc = n.r_vaddr;
+ section->reloc_count = hdr->s_nreloc = n.r_vaddr;
}
}
#undef ALIGN_SET
if ((hdr->s_flags & STYP_OVRFLO) == 0)
return;
- real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
+ real_sec = coff_section_from_bfd_index (abfd, (int) hdr->s_nreloc);
if (real_sec == NULL)
return;
{
if (*ps == section)
{
- *ps = (*ps)->next;
+ bfd_section_list_remove (abfd, ps);
--abfd->section_count;
break;
}
#ifndef coff_mkobject
-static boolean coff_mkobject PARAMS ((bfd *));
+static bfd_boolean coff_mkobject PARAMS ((bfd *));
-static boolean
+static bfd_boolean
coff_mkobject (abfd)
bfd * abfd;
{
coff_data_type *coff;
+ bfd_size_type amt = sizeof (coff_data_type);
- abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
+ abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, amt);
if (abfd->tdata.coff_obj_data == 0)
- return false;
+ return FALSE;
coff = coff_data (abfd);
coff->symbols = (coff_symbol_type *) NULL;
coff->conversion_table = (unsigned int *) NULL;
/* make_abs_section(abfd);*/
- return true;
+ return TRUE;
}
#endif
struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
coff_data_type *coff;
- if (coff_mkobject (abfd) == false)
+ if (! coff_mkobject (abfd))
return NULL;
coff = coff_data (abfd);
# else
xcoff->xcoff64 = 0;
# endif
- xcoff->full_aouthdr = true;
+ xcoff->full_aouthdr = TRUE;
xcoff->toc = internal_a->o_toc;
xcoff->sntoc = internal_a->o_sntoc;
xcoff->snentry = internal_a->o_snentry;
- xcoff->text_align_power = internal_a->o_algntext;
- xcoff->data_align_power = internal_a->o_algndata;
+ bfd_xcoff_text_align_power (abfd) = internal_a->o_algntext;
+ bfd_xcoff_data_align_power (abfd) = internal_a->o_algndata;
xcoff->modtype = internal_a->o_modtype;
xcoff->cputype = internal_a->o_cputype;
xcoff->maxdata = internal_a->o_maxdata;
#endif
#ifdef ARM
- /* Set the flags field from the COFF header read in */
+ /* Set the flags field from the COFF header read in. */
if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
coff->flags = 0;
#endif
would be target independent and would also be much more successful
at linking together COFF files for different architectures. */
-static boolean
+static bfd_boolean
coff_set_arch_mach_hook (abfd, filehdr)
bfd *abfd;
PTR filehdr;
{
- long machine;
+ unsigned long machine;
enum bfd_architecture arch;
struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
+ /* Zero selects the default machine for an arch. */
machine = 0;
switch (internal_f->f_magic)
{
+#ifdef OR32_MAGIC_BIG
+ case OR32_MAGIC_BIG:
+ case OR32_MAGIC_LITTLE:
+ arch = bfd_arch_or32;
+ break;
+#endif
#ifdef PPCMAGIC
case PPCMAGIC:
arch = bfd_arch_powerpc;
- machine = 0; /* what does this mean? (krk) */
break;
#endif
#ifdef I386MAGIC
case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
arch = bfd_arch_i386;
- machine = 0;
break;
#endif
#ifdef IA64MAGIC
case IA64MAGIC:
arch = bfd_arch_ia64;
- machine = 0;
break;
#endif
#ifdef A29K_MAGIC_BIG
case A29K_MAGIC_BIG:
case A29K_MAGIC_LITTLE:
arch = bfd_arch_a29k;
- machine = 0;
break;
#endif
#ifdef ARMMAGIC
case F_ARM_3M: machine = bfd_mach_arm_3M; break;
case F_ARM_4: machine = bfd_mach_arm_4; break;
case F_ARM_4T: machine = bfd_mach_arm_4T; break;
- case F_ARM_5: machine = bfd_mach_arm_5; break;
+ /* The COFF header does not have enough bits available
+ to cover all the different ARM architectures. So
+ we interpret F_ARM_5, the highest flag value to mean
+ "the highest ARM architecture known to BFD" which is
+ currently the XScale. */
+ case F_ARM_5: machine = bfd_mach_arm_XScale; break;
}
break;
#endif
machine = bfd_mach_z8002;
break;
default:
- return false;
+ return FALSE;
}
break;
#endif
#ifdef RS6000COFF_C
#ifdef XCOFF64
+ case U64_TOCMAGIC:
case U803XTOCMAGIC:
#else
case U802ROMAGIC:
{
bfd_byte *buf;
struct internal_syment sym;
+ bfd_size_type amt = bfd_coff_symesz (abfd);
- buf = (bfd_byte *) bfd_malloc (bfd_coff_symesz (abfd));
+ buf = (bfd_byte *) bfd_malloc (amt);
if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
- || (bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd)
- != bfd_coff_symesz (abfd)))
+ || bfd_bread (buf, amt, abfd) != amt)
{
free (buf);
- return false;
+ return FALSE;
}
bfd_coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
if (sym.n_sclass == C_FILE)
{
default:
case 0:
-#ifdef POWERMAC
- /* PowerPC Macs use the same magic numbers as RS/6000
- (because that's how they were bootstrapped originally),
- but they are always PowerPC architecture. */
- arch = bfd_arch_powerpc;
- machine = bfd_mach_ppc;
-#else
-#ifdef XCOFF64
- arch = bfd_arch_powerpc;
- machine = bfd_mach_ppc_620;
-#else
- arch = bfd_arch_rs6000;
- machine = bfd_mach_rs6k;
-#endif
-#endif /* POWERMAC */
+ arch = bfd_xcoff_architecture (abfd);
+ machine = bfd_xcoff_machine (abfd);
break;
case 1:
#ifdef WE32KMAGIC
case WE32KMAGIC:
arch = bfd_arch_we32k;
- machine = 0;
break;
#endif
case SH_ARCH_MAGIC_WINCE:
#endif
arch = bfd_arch_sh;
- machine = 0;
break;
#endif
#ifdef MIPS_ARCH_MAGIC_WINCE
case MIPS_ARCH_MAGIC_WINCE:
arch = bfd_arch_mips;
- machine = 0;
break;
#endif
#ifdef H8500MAGIC
case H8500MAGIC:
arch = bfd_arch_h8500;
- machine = 0;
break;
#endif
case LYNXCOFFMAGIC:
#endif
arch = bfd_arch_sparc;
- machine = 0;
break;
#endif
/* this TI COFF section should be used by all new TI COFF v0 targets */
case TICOFF0MAGIC:
arch = TICOFF_TARGET_ARCH;
+ machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags);
break;
#endif
#endif
#ifdef TI_TARGET_ID
case TI_TARGET_ID:
arch = TICOFF_TARGET_ARCH;
+ machine = TICOFF_TARGET_MACHINE_GET (internal_f->f_flags);
break;
#endif
default:
arch = bfd_arch_mcore;
break;
#endif
+
+#ifdef W65MAGIC
+ case W65MAGIC:
+ arch = bfd_arch_w65;
+ break;
+#endif
+
default: /* Unreadable input file type */
arch = bfd_arch_obscure;
break;
}
bfd_default_set_arch_mach (abfd, arch, machine);
- return true;
+ return TRUE;
}
#ifdef SYMNAME_IN_DEBUG
-static boolean symname_in_debug_hook
+static bfd_boolean symname_in_debug_hook
PARAMS ((bfd *, struct internal_syment *));
-static boolean
+static bfd_boolean
symname_in_debug_hook (abfd, sym)
bfd * abfd ATTRIBUTE_UNUSED;
struct internal_syment *sym;
{
- return SYMNAME_IN_DEBUG (sym) ? true : false;
+ return SYMNAME_IN_DEBUG (sym) != 0;
}
#else
#define symname_in_debug_hook \
- (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
+ (bfd_boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
#endif
/* Handle the csect auxent of a C_EXT or C_HIDEXT symbol. */
-static boolean coff_pointerize_aux_hook
+static bfd_boolean coff_pointerize_aux_hook
PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
unsigned int, combined_entry_type *));
/*ARGSUSED*/
-static boolean
+static bfd_boolean
coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
bfd *abfd ATTRIBUTE_UNUSED;
combined_entry_type *table_base;
aux->fix_scnlen = 1;
}
- /* Return true to indicate that the caller should not do any
+ /* Return TRUE to indicate that the caller should not do any
further work on this auxent. */
- return true;
+ return TRUE;
}
- /* Return false to indicate that this auxent should be handled by
+ /* Return FALSE to indicate that this auxent should be handled by
the caller. */
- return false;
+ return FALSE;
}
#else
/* We don't want to pointerize bal entries. */
-static boolean coff_pointerize_aux_hook
+static bfd_boolean coff_pointerize_aux_hook
PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
unsigned int, combined_entry_type *));
/*ARGSUSED*/
-static boolean
+static bfd_boolean
coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
bfd *abfd ATTRIBUTE_UNUSED;
combined_entry_type *table_base ATTRIBUTE_UNUSED;
unsigned int indaux;
combined_entry_type *aux ATTRIBUTE_UNUSED;
{
- /* Return true if we don't want to pointerize this aux entry, which
+ /* Return TRUE if we don't want to pointerize this aux entry, which
is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */
return (indaux == 1
&& (symbol->u.syment.n_sclass == C_LEAFPROC
#endif /* ! I960 */
#endif /* ! RS6000COFF_C */
-/* Print an aux entry. This returns true if it has printed it. */
+/* Print an aux entry. This returns TRUE if it has printed it. */
-static boolean coff_print_aux
+static bfd_boolean coff_print_aux
PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
combined_entry_type *, unsigned int));
-static boolean
+static bfd_boolean
coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
bfd *abfd ATTRIBUTE_UNUSED;
FILE *file ATTRIBUTE_UNUSED;
if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
{
BFD_ASSERT (! aux->fix_scnlen);
- fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
+#ifdef XCOFF64
+ fprintf (file, "val %5lld", aux->u.auxent.x_csect.x_scnlen.l);
+#else
+ fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
+#endif
}
else
{
fprintf (file, "indx ");
if (! aux->fix_scnlen)
- fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
+#ifdef XCOFF64
+ fprintf (file, "%4lld", aux->u.auxent.x_csect.x_scnlen.l);
+#else
+ fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
+#endif
else
fprintf (file, "%4ld",
(long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
(unsigned int) aux->u.auxent.x_csect.x_smclas,
aux->u.auxent.x_csect.x_stab,
(unsigned int) aux->u.auxent.x_csect.x_snstab);
- return true;
+ return TRUE;
}
#endif
- /* Return false to indicate that no special action was taken. */
- return false;
+ /* Return FALSE to indicate that no special action was taken. */
+ return FALSE;
}
/*
#endif /* TARG_AUX */
-static boolean
+static bfd_boolean
coff_write_relocs (abfd, first_undef)
bfd * abfd;
int first_undef;
#ifndef TARG_AUX
p = s->orelocation;
#else
- /* sort relocations before we write them out */
- p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
- if (p == NULL && s->reloc_count > 0)
- return false;
- memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
- qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
+ {
+ /* sort relocations before we write them out */
+ bfd_size_type amt;
+
+ amt = s->reloc_count;
+ amt *= sizeof (arelent *);
+ p = (arelent **) bfd_malloc (amt);
+ if (p == NULL && s->reloc_count > 0)
+ return FALSE;
+ memcpy (p, s->orelocation, (size_t) amt);
+ qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
+ }
#endif
if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
- return false;
+ return FALSE;
#ifdef COFF_WITH_PE
- if (s->reloc_count > 0xffff)
+ if (obj_pe (abfd) && s->reloc_count >= 0xffff)
{
/* encode real count here as first reloc */
struct internal_reloc n;
/* add one to count *this* reloc (grr) */
n.r_vaddr = s->reloc_count + 1;
coff_swap_reloc_out (abfd, &n, &dst);
- if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
- != bfd_coff_relsz (abfd))
- return false;
+ if (bfd_bwrite ((PTR) & dst, (bfd_size_type) bfd_coff_relsz (abfd),
+ abfd) != bfd_coff_relsz (abfd))
+ return FALSE;
}
#endif
if (q->sym_ptr_ptr[0]->the_bfd != abfd)
{
- int i;
+ int j;
const char *sname = q->sym_ptr_ptr[0]->name;
asymbol **outsyms = abfd->outsymbols;
- for (i = first_undef; outsyms[i]; i++)
+ for (j = first_undef; outsyms[j]; j++)
{
- const char *intable = outsyms[i]->name;
+ const char *intable = outsyms[j]->name;
if (strcmp (intable, sname) == 0) {
/* got a hit, so repoint the reloc */
- q->sym_ptr_ptr = outsyms + i;
+ q->sym_ptr_ptr = outsyms + j;
break;
}
}
#ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
#else
- if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
+ if ((*q->sym_ptr_ptr)->section == bfd_abs_section_ptr
+ && ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0)
#endif
/* This is a relocation relative to the absolute symbol. */
n.r_symndx = -1;
n.r_type = q->howto->type;
#endif
coff_swap_reloc_out (abfd, &n, &dst);
- if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
- != bfd_coff_relsz (abfd))
- return false;
+ if (bfd_bwrite ((PTR) & dst, (bfd_size_type) bfd_coff_relsz (abfd),
+ abfd) != bfd_coff_relsz (abfd))
+ return FALSE;
}
#ifdef TARG_AUX
#endif
}
- return true;
+ return TRUE;
}
/* Set flags and magic number of a coff file from architecture and machine
- type. Result is true if we can represent the arch&type, false if not. */
+ type. Result is TRUE if we can represent the arch&type, FALSE if not. */
-static boolean
+static bfd_boolean
coff_set_flags (abfd, magicp, flagsp)
bfd * abfd;
unsigned int *magicp ATTRIBUTE_UNUSED;
*flagsp = F_Z8002;
break;
default:
- return false;
+ return FALSE;
}
- return true;
+ return TRUE;
#endif
#ifdef I960ROMAGIC
flags = F_I960HX;
break;
default:
- return false;
+ return FALSE;
}
*flagsp = flags;
- return true;
+ return TRUE;
}
break;
#endif
#ifdef TIC30MAGIC
case bfd_arch_tic30:
*magicp = TIC30MAGIC;
- return true;
+ return TRUE;
#endif
#ifdef TICOFF_DEFAULT_MAGIC
*magicp = TICOFF2MAGIC;
break;
default:
- return false;
+ return FALSE;
}
}
- return true;
+ TICOFF_TARGET_MACHINE_SET (flagsp, bfd_get_mach (abfd));
+ return TRUE;
#endif
#ifdef TIC80_ARCH_MAGIC
case bfd_arch_tic80:
*magicp = TIC80_ARCH_MAGIC;
- return true;
+ return TRUE;
#endif
#ifdef ARMMAGIC
case bfd_arch_arm:
case bfd_mach_arm_4: * flagsp |= F_ARM_4; break;
case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
case bfd_mach_arm_5: * flagsp |= F_ARM_5; break;
- /* FIXME: we do not have F_ARM vaues greater than F_ARM_5. */
+ /* FIXME: we do not have F_ARM vaues greater than F_ARM_5.
+ See also the comment in coff_set_arch_mach_hook(). */
case bfd_mach_arm_5T: * flagsp |= F_ARM_5; break;
case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
}
- return true;
+ return TRUE;
#endif
#ifdef PPCMAGIC
case bfd_arch_powerpc:
*magicp = PPCMAGIC;
- return true;
+ return TRUE;
break;
#endif
#ifdef I386MAGIC
/* Just overwrite the usual value if we're doing Lynx. */
*magicp = LYNXCOFFMAGIC;
#endif
- return true;
+ return TRUE;
break;
#endif
#ifdef I860MAGIC
case bfd_arch_i860:
*magicp = I860MAGIC;
- return true;
+ return TRUE;
break;
#endif
#ifdef IA64MAGIC
case bfd_arch_ia64:
*magicp = IA64MAGIC;
- return true;
+ return TRUE;
break;
#endif
#ifdef MC68MAGIC
/* Just overwrite the usual value if we're doing Lynx. */
*magicp = LYNXCOFFMAGIC;
#endif
- return true;
+ return TRUE;
break;
#endif
#ifdef MC88MAGIC
case bfd_arch_m88k:
*magicp = MC88OMAGIC;
- return true;
+ return TRUE;
break;
#endif
#ifdef H8300MAGIC
{
case bfd_mach_h8300:
*magicp = H8300MAGIC;
- return true;
+ return TRUE;
case bfd_mach_h8300h:
*magicp = H8300HMAGIC;
- return true;
+ return TRUE;
case bfd_mach_h8300s:
*magicp = H8300SMAGIC;
- return true;
+ return TRUE;
}
break;
#endif
else
*magicp = SH_ARCH_MAGIC_LITTLE;
#endif
- return true;
+ return TRUE;
break;
#endif
#ifdef MIPS_ARCH_MAGIC_WINCE
case bfd_arch_mips:
*magicp = MIPS_ARCH_MAGIC_WINCE;
- return true;
+ return TRUE;
break;
#endif
/* Just overwrite the usual value if we're doing Lynx. */
*magicp = LYNXCOFFMAGIC;
#endif
- return true;
+ return TRUE;
break;
#endif
#ifdef H8500MAGIC
case bfd_arch_h8500:
*magicp = H8500MAGIC;
- return true;
+ return TRUE;
break;
#endif
#ifdef A29K_MAGIC_BIG
*magicp = A29K_MAGIC_BIG;
else
*magicp = A29K_MAGIC_LITTLE;
- return true;
+ return TRUE;
break;
#endif
#ifdef WE32KMAGIC
case bfd_arch_we32k:
*magicp = WE32KMAGIC;
- return true;
+ return TRUE;
break;
#endif
#ifndef PPCMAGIC
case bfd_arch_powerpc:
#endif
-#ifdef XCOFF64
- if (bfd_get_mach (abfd) == bfd_mach_ppc_620
- && !strncmp (abfd->xvec->name,"aix", 3))
- *magicp = U803XTOCMAGIC;
- else
-#else
- *magicp = U802TOCMAGIC;
-#endif
- return true;
+ BFD_ASSERT (bfd_get_flavour (abfd) == bfd_target_xcoff_flavour);
+ *magicp = bfd_xcoff_magic_number (abfd);
+ return TRUE;
break;
#endif
#ifdef MCOREMAGIC
case bfd_arch_mcore:
* magicp = MCOREMAGIC;
- return true;
+ return TRUE;
#endif
#ifdef W65MAGIC
case bfd_arch_w65:
*magicp = W65MAGIC;
- return true;
+ return TRUE;
+#endif
+
+#ifdef OR32_MAGIC_BIG
+ case bfd_arch_or32:
+ if (bfd_big_endian (abfd))
+ * magicp = OR32_MAGIC_BIG;
+ else
+ * magicp = OR32_MAGIC_LITTLE;
+ return TRUE;
#endif
default: /* Unknown architecture. */
- /* Fall through to "return false" below, to avoid
+ /* Fall through to "return FALSE" below, to avoid
"statement never reached" errors on the one below. */
break;
}
- return false;
+ return FALSE;
}
-static boolean
+static bfd_boolean
coff_set_arch_mach (abfd, arch, machine)
bfd * abfd;
enum bfd_architecture arch;
unsigned short dummy2;
if (! bfd_default_set_arch_mach (abfd, arch, machine))
- return false;
+ return FALSE;
- if (arch != bfd_arch_unknown &&
- coff_set_flags (abfd, &dummy1, &dummy2) != true)
- return false; /* We can't represent this type */
+ if (arch != bfd_arch_unknown
+ && ! coff_set_flags (abfd, &dummy1, &dummy2))
+ return FALSE; /* We can't represent this type */
- return true; /* We're easy ... */
+ return TRUE; /* We're easy ... */
}
#ifdef COFF_IMAGE_WITH_PE
#undef ALIGN_SECTIONS_IN_FILE
#endif
-static boolean
+static bfd_boolean
coff_compute_section_file_positions (abfd)
bfd * abfd;
{
asection *current;
asection *previous = (asection *) NULL;
file_ptr sofar = bfd_coff_filhsz (abfd);
- boolean align_adjust;
+ bfd_boolean align_adjust;
#ifdef ALIGN_SECTIONS_IN_FILE
file_ptr old_sofar;
#endif
right order in the image file itself, but we do need to get the
target_index values right. */
- int count;
+ unsigned int count;
asection **section_list;
- int i;
+ unsigned int i;
int target_index;
+ bfd_size_type amt;
count = 0;
for (current = abfd->sections; current != NULL; current = current->next)
++count;
/* We allocate an extra cell to simplify the final loop. */
- section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
+ amt = sizeof (struct asection *) * (count + 1);
+ section_list = bfd_malloc (amt);
if (section_list == NULL)
- return false;
+ return FALSE;
i = 0;
for (current = abfd->sections; current != NULL; current = current->next)
else
current->target_index = target_index++;
}
+ abfd->section_tail = ¤t->next;
free (section_list);
}
}
#endif /* ! COFF_IMAGE_WITH_PE */
- align_adjust = false;
+ align_adjust = FALSE;
for (current = abfd->sections;
current != (asection *) NULL;
current = current->next)
page size too, and remember both sizes. */
if (coff_section_data (abfd, current) == NULL)
{
- current->used_by_bfd =
- (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
+ bfd_size_type amt = sizeof (struct coff_section_tdata);
+ current->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
if (current->used_by_bfd == NULL)
- return false;
+ return FALSE;
}
if (pei_section_data (abfd, current) == NULL)
{
- coff_section_data (abfd, current)->tdata =
- (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
+ bfd_size_type amt = sizeof (struct pei_section_tdata);
+ coff_section_data (abfd, current)->tdata
+ = (PTR) bfd_zalloc (abfd, amt);
if (coff_section_data (abfd, current)->tdata == NULL)
- return false;
+ return FALSE;
}
if (pei_section_data (abfd, current)->virt_size == 0)
pei_section_data (abfd, current)->virt_size = current->_raw_size;
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. */
+ 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);
+ }
+#endif
if (previous != (asection *) NULL)
{
previous->_raw_size += sofar - old_sofar;
_raw_size, in case the caller only writes out data to the
unaligned _raw_size. */
if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
- align_adjust = true;
+ align_adjust = TRUE;
#endif
#ifdef _LIB
b = 0;
if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
- || bfd_write (&b, 1, 1, abfd) != 1)
- return false;
+ || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
+ return FALSE;
}
/* Make sure the relocations are aligned. We don't need to make
sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
obj_relocbase (abfd) = sofar;
- abfd->output_has_begun = true;
+ abfd->output_has_begun = TRUE;
- return true;
+ return TRUE;
}
#if 0
/* If .file, .text, .data, .bss symbols are missing, add them. */
/* @@ Should we only be adding missing symbols, or overriding the aux
values for existing section symbols? */
-static boolean
+static bfd_boolean
coff_add_missing_symbols (abfd)
bfd *abfd;
{
asymbol **sympp2;
unsigned int i;
int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
+ bfd_size_type amt;
for (i = 0; i < nsyms; i++)
{
coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
- CONST char *name;
+ const char *name;
if (csym)
{
/* only do this if there is a coff representation of the input
need_file = 0;
if (!need_text && !need_data && !need_bss && !need_file)
- return true;
+ return TRUE;
nsyms += need_text + need_data + need_bss + need_file;
- sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
+ amt = nsyms;
+ amt *= sizeof (asymbol *);
+ sympp2 = (asymbol **) bfd_alloc (abfd, amt);
if (!sympp2)
- return false;
+ return FALSE;
memcpy (sympp2, sympp, i * sizeof (asymbol *));
if (need_file)
{
sympp2[i++] = coff_section_symbol (abfd, _BSS);
BFD_ASSERT (i == nsyms);
bfd_set_symtab (abfd, sympp2, nsyms);
- return true;
+ return TRUE;
}
#endif /* 0 */
+#ifdef COFF_IMAGE_WITH_PE
+
+static unsigned int pelength;
+static unsigned int peheader;
+
+static bfd_boolean
+coff_read_word (abfd, value)
+ bfd *abfd;
+ unsigned int *value;
+{
+ unsigned char b[2];
+ int status;
+
+ status = bfd_bread (b, (bfd_size_type) 2, abfd);
+ if (status < 1)
+ {
+ *value = 0;
+ return FALSE;
+ }
+
+ if (status == 1)
+ *value = (unsigned int) b[0];
+ else
+ *value = (unsigned int) (b[0] + (b[1] << 8));
+
+ pelength += (unsigned int) status;
+
+ return TRUE;
+}
+
+static unsigned int
+coff_compute_checksum (abfd)
+ bfd *abfd;
+{
+ bfd_boolean more_data;
+ file_ptr filepos;
+ unsigned int value;
+ unsigned int total;
+
+ total = 0;
+ pelength = 0;
+ filepos = (file_ptr) 0;
+
+ do
+ {
+ if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
+ return 0;
+
+ more_data = coff_read_word (abfd, &value);
+ total += value;
+ total = 0xffff & (total + (total >> 0x10));
+ filepos += 2;
+ }
+ while (more_data);
+
+ return (0xffff & (total + (total >> 0x10)));
+}
+
+static bfd_boolean
+coff_apply_checksum (abfd)
+ bfd *abfd;
+{
+ unsigned int computed;
+ unsigned int checksum = 0;
+
+ if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0)
+ return FALSE;
+
+ if (!coff_read_word (abfd, &peheader))
+ return FALSE;
+
+ if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
+ return FALSE;
+
+ checksum = 0;
+ bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
+
+ if (bfd_seek (abfd, peheader, SEEK_SET) != 0)
+ return FALSE;
+
+ computed = coff_compute_checksum (abfd);
+
+ checksum = computed + pelength;
+
+ if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
+ return FALSE;
+
+ bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
+
+ return TRUE;
+}
+
+#endif /* COFF_IMAGE_WITH_PE */
+
/* SUPPRESS 558 */
/* SUPPRESS 529 */
-static boolean
+static bfd_boolean
coff_write_object_contents (abfd)
bfd * abfd;
{
asection *current;
- boolean hasrelocs = false;
- boolean haslinno = false;
- boolean hasdebug = false;
+ bfd_boolean hasrelocs = FALSE;
+ bfd_boolean haslinno = FALSE;
+ bfd_boolean hasdebug = FALSE;
file_ptr scn_base;
file_ptr reloc_base;
file_ptr lineno_base;
file_ptr sym_base;
unsigned long reloc_size = 0, reloc_count = 0;
unsigned long lnno_size = 0;
- boolean long_section_names;
+ bfd_boolean long_section_names;
asection *text_sec = NULL;
asection *data_sec = NULL;
asection *bss_sec = NULL;
lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
- if (abfd->output_has_begun == false)
+ if (! abfd->output_has_begun)
{
if (! coff_compute_section_file_positions (abfd))
- return false;
+ return FALSE;
}
reloc_base = obj_relocbase (abfd);
{
#ifdef COFF_WITH_PE
/* we store the actual reloc count in the first reloc's addr */
- if (current->reloc_count > 0xffff)
+ if (obj_pe (abfd) && current->reloc_count >= 0xffff)
reloc_count ++;
#endif
reloc_count += current->reloc_count;
reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
#ifdef COFF_WITH_PE
/* extra reloc to hold real count */
- if (current->reloc_count > 0xffff)
+ if (obj_pe (abfd) && current->reloc_count >= 0xffff)
reloc_base += bfd_coff_relsz (abfd);
#endif
}
{
scn_base = bfd_coff_filhsz (abfd);
#ifdef RS6000COFF_C
+#ifndef XCOFF64
if (xcoff_data (abfd)->full_aouthdr)
scn_base += bfd_coff_aoutsz (abfd);
else
scn_base += SMALL_AOUTSZ;
+#endif
#endif
}
if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
- return false;
+ return FALSE;
- long_section_names = false;
+ long_section_names = FALSE;
for (current = abfd->sections;
current != NULL;
current = current->next)
{
struct internal_scnhdr section;
- boolean is_reloc_section = false;
+ bfd_boolean is_reloc_section = FALSE;
#ifdef COFF_IMAGE_WITH_PE
if (strcmp (current->name, ".reloc") == 0)
{
- is_reloc_section = true;
- hasrelocs = true;
+ is_reloc_section = TRUE;
+ hasrelocs = TRUE;
pe_data (abfd)->has_reloc_section = 1;
}
#endif
memset (section.s_name, 0, SCNNMLEN);
sprintf (section.s_name, "/%lu", (unsigned long) string_size);
string_size += len + 1;
- long_section_names = true;
+ long_section_names = TRUE;
}
}
#endif
#ifndef COFF_IMAGE_WITH_PE
/* In PEI, relocs come in the .reloc section. */
if (current->reloc_count != 0)
- hasrelocs = true;
+ hasrelocs = TRUE;
#endif
if (current->lineno_count != 0)
- haslinno = true;
+ haslinno = TRUE;
if ((current->flags & SEC_DEBUGGING) != 0
&& ! is_reloc_section)
- hasdebug = true;
+ hasdebug = TRUE;
#ifdef RS6000COFF_C
#ifndef XCOFF64
#endif
{
SCNHDR buff;
+ bfd_size_type amt = bfd_coff_scnhsz (abfd);
+
if (coff_swap_scnhdr_out (abfd, §ion, &buff) == 0
- || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
- != bfd_coff_scnhsz (abfd))
- return false;
+ || bfd_bwrite ((PTR) &buff, amt, abfd) != amt)
+ return FALSE;
}
#ifdef COFF_WITH_PE
}
#ifdef RS6000COFF_C
+#ifndef XCOFF64
/* XCOFF handles overflows in the reloc and line number count fields
by creating a new section header to hold the correct values. */
for (current = abfd->sections; current != NULL; current = current->next)
{
struct internal_scnhdr scnhdr;
SCNHDR buff;
+ bfd_size_type amt;
internal_f.f_nscns++;
strncpy (&(scnhdr.s_name[0]), current->name, 8);
scnhdr.s_nreloc = current->target_index;
scnhdr.s_nlnno = current->target_index;
scnhdr.s_flags = STYP_OVRFLO;
+ amt = bfd_coff_scnhsz (abfd);
if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
- || bfd_write ((PTR) &buff, 1, bfd_coff_scnhsz (abfd), abfd)
- != bfd_coff_scnhsz (abfd))
- return false;
+ || bfd_bwrite ((PTR) &buff, amt, abfd) != amt)
+ return FALSE;
}
}
+#endif
#endif
/* OK, now set up the filehdr... */
{
internal_f.f_opthdr = 0;
#ifdef RS6000COFF_C
+#ifndef XCOFF64
if (xcoff_data (abfd)->full_aouthdr)
internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
else
internal_f.f_opthdr = SMALL_AOUTSZ;
+#endif
#endif
}
internal_a.magic = MIPS_PE_MAGIC;
#endif
+#ifdef OR32
+#define __A_MAGIC_SET__
+ internal_a.magic = NMAGIC; /* Assume separate i/d. */
+#endif
+
#ifndef __A_MAGIC_SET__
#include "Your aouthdr magic number is not being set!"
#else
int firstundef;
#if 0
if (!coff_add_missing_symbols (abfd))
- return false;
+ return FALSE;
#endif
if (!coff_renumber_symbols (abfd, &firstundef))
- return false;
+ return FALSE;
coff_mangle_symbols (abfd);
if (! coff_write_symbols (abfd))
- return false;
+ return FALSE;
if (! coff_write_linenumbers (abfd))
- return false;
+ return FALSE;
if (! coff_write_relocs (abfd, firstundef))
- return false;
+ return FALSE;
}
#ifdef COFF_LONG_SECTION_NAMES
else if (long_section_names && ! obj_coff_strings_written (abfd))
/* If we have long section names we have to write out the string
table even if there are no symbols. */
if (! coff_write_symbols (abfd))
- return false;
+ return FALSE;
}
#endif
#ifdef COFF_IMAGE_WITH_PE
rounded up to the page size. */
b = 0;
if (bfd_seek (abfd,
- BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
+ (file_ptr) BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
SEEK_SET) != 0
- || bfd_write (&b, 1, 1, abfd) != 1)
- return false;
+ || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
+ return FALSE;
}
#endif
#endif
internal_a.o_cputype = 4;
break;
case bfd_arch_powerpc:
- if (bfd_get_mach (abfd) == 0)
+ if (bfd_get_mach (abfd) == bfd_mach_ppc)
internal_a.o_cputype = 3;
else
internal_a.o_cputype = 1;
/* now write them */
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
- return false;
+ return FALSE;
{
char * buff;
- bfd_size_type amount;
+ bfd_size_type amount = bfd_coff_filhsz (abfd);
- buff = bfd_malloc (bfd_coff_filhsz (abfd));
+ buff = bfd_malloc (amount);
if (buff == NULL)
- return false;
+ return FALSE;
- coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
- amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
+ bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, (PTR) buff);
+ amount = bfd_bwrite ((PTR) buff, amount, abfd);
free (buff);
if (amount != bfd_coff_filhsz (abfd))
- return false;
+ return FALSE;
}
if (abfd->flags & EXEC_P)
/* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)) */
char * buff;
- bfd_size_type amount;
+ bfd_size_type amount = bfd_coff_aoutsz (abfd);
- buff = bfd_malloc (bfd_coff_aoutsz (abfd));
+ buff = bfd_malloc (amount);
if (buff == NULL)
- return false;
+ return FALSE;
- coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
- amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
+ coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) buff);
+ amount = bfd_bwrite ((PTR) buff, amount, abfd);
free (buff);
if (amount != bfd_coff_aoutsz (abfd))
- return false;
+ return FALSE;
+
+#ifdef COFF_IMAGE_WITH_PE
+ if (! coff_apply_checksum (abfd))
+ return FALSE;
+#endif
}
#ifdef RS6000COFF_C
else
size = bfd_coff_aoutsz (abfd);
else
size = SMALL_AOUTSZ;
- if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
- return false;
+ if (bfd_bwrite ((PTR) &buff, (bfd_size_type) size, abfd) != size)
+ return FALSE;
}
#endif
- return true;
+ return TRUE;
}
-static boolean
+static bfd_boolean
coff_set_section_contents (abfd, section, location, offset, count)
bfd * abfd;
sec_ptr section;
file_ptr offset;
bfd_size_type count;
{
- if (abfd->output_has_begun == false) /* set by bfd.c handler */
+ if (! abfd->output_has_begun) /* set by bfd.c handler */
{
if (! coff_compute_section_file_positions (abfd))
- return false;
+ return FALSE;
}
#if defined(_LIB) && !defined(TARG_AUX)
/* Don't write out bss sections - one way to do this is to
see if the filepos has not been set. */
if (section->filepos == 0)
- return true;
+ return TRUE;
- if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
- return false;
+ if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
+ return FALSE;
- if (count != 0)
- {
- return (bfd_write (location, 1, count, abfd) == count) ? true : false;
- }
- return true;
+ if (count == 0)
+ return TRUE;
+
+ return bfd_bwrite (location, count, abfd) == count;
}
#if 0
-static boolean
+static bfd_boolean
coff_close_and_cleanup (abfd)
bfd *abfd;
{
{
case bfd_archive:
if (!_bfd_write_archive_contents (abfd))
- return false;
+ return FALSE;
break;
case bfd_object:
if (!coff_write_object_contents (abfd))
- return false;
+ return FALSE;
break;
default:
bfd_set_error (bfd_error_invalid_operation);
- return false;
+ return FALSE;
}
/* We depend on bfd_close to free all the memory on the objalloc. */
- return true;
+ return TRUE;
}
#endif
static PTR
-buy_and_read (abfd, where, seek_direction, size)
+buy_and_read (abfd, where, size)
bfd *abfd;
file_ptr where;
- int seek_direction;
- size_t size;
+ bfd_size_type size;
{
PTR area = (PTR) bfd_alloc (abfd, size);
if (!area)
return (NULL);
- if (bfd_seek (abfd, where, seek_direction) != 0
- || bfd_read (area, 1, size, abfd) != size)
+ if (bfd_seek (abfd, where, SEEK_SET) != 0
+ || bfd_bread (area, size, abfd) != size)
return (NULL);
return (area);
} /* buy_and_read() */
*/
-static boolean
+static bfd_boolean
coff_slurp_line_table (abfd, asect)
bfd *abfd;
asection *asect;
{
LINENO *native_lineno;
alent *lineno_cache;
+ bfd_size_type amt;
BFD_ASSERT (asect->lineno == (alent *) NULL);
- native_lineno = (LINENO *) buy_and_read (abfd,
- asect->line_filepos,
- SEEK_SET,
- (size_t) (bfd_coff_linesz (abfd) *
- asect->lineno_count));
- lineno_cache =
- (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
+ amt = (bfd_size_type) bfd_coff_linesz (abfd) * asect->lineno_count;
+ native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, amt);
+ amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
+ lineno_cache = (alent *) bfd_alloc (abfd, amt);
if (lineno_cache == NULL)
- return false;
+ return FALSE;
else
{
unsigned int counter = 0;
if (cache_ptr->line_number == 0)
{
- boolean warned;
- long symndx;
+ bfd_boolean warned;
+ bfd_signed_vma symndx;
coff_symbol_type *sym;
- warned = false;
+ warned = FALSE;
symndx = dst.l_addr.l_symndx;
if (symndx < 0
- || (unsigned long) symndx >= obj_raw_syment_count (abfd))
+ || (bfd_vma) symndx >= obj_raw_syment_count (abfd))
{
(*_bfd_error_handler)
(_("%s: warning: illegal symbol index %ld in line numbers"),
- bfd_get_filename (abfd), dst.l_addr.l_symndx);
+ bfd_archive_filename (abfd), dst.l_addr.l_symndx);
symndx = 0;
- warned = true;
+ warned = TRUE;
}
/* FIXME: We should not be casting between ints and
pointers like this. */
{
(*_bfd_error_handler)
(_("%s: warning: duplicate line number information for `%s'"),
- bfd_get_filename (abfd),
+ bfd_archive_filename (abfd),
bfd_asymbol_name (&sym->symbol));
}
sym->lineno = cache_ptr;
}
asect->lineno = lineno_cache;
/* FIXME, free native_lineno here, or use alloca or something. */
- return true;
+ return TRUE;
}
/* Slurp in the symbol table, converting it to generic form. Note
that if coff_relocate_section is defined, the linker will read
symbols via coff_link_add_symbols, rather than via this routine. */
-static boolean
+static bfd_boolean
coff_slurp_symbol_table (abfd)
bfd * abfd;
{
combined_entry_type *native_symbols;
coff_symbol_type *cached_area;
unsigned int *table_ptr;
+ bfd_size_type amt;
unsigned int number_of_symbols = 0;
if (obj_symbols (abfd))
- return true;
+ return TRUE;
/* Read in the symbol table */
if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
{
- return (false);
+ return FALSE;
} /* on error */
/* Allocate enough room for all the symbols in cached form */
- cached_area = ((coff_symbol_type *)
- bfd_alloc (abfd,
- (obj_raw_syment_count (abfd)
- * sizeof (coff_symbol_type))));
-
+ amt = obj_raw_syment_count (abfd);
+ amt *= sizeof (coff_symbol_type);
+ cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt);
if (cached_area == NULL)
- return false;
- table_ptr = ((unsigned int *)
- bfd_alloc (abfd,
- (obj_raw_syment_count (abfd)
- * sizeof (unsigned int))));
+ return FALSE;
+
+ amt = obj_raw_syment_count (abfd);
+ amt *= sizeof (unsigned int);
+ table_ptr = (unsigned int *) bfd_alloc (abfd, amt);
if (table_ptr == NULL)
- return false;
+ return FALSE;
else
{
coff_symbol_type *dst = cached_area;
dst->symbol.section = coff_section_from_bfd_index (abfd,
src->u.syment.n_scnum);
dst->symbol.flags = 0;
- dst->done_lineno = false;
+ dst->done_lineno = FALSE;
switch (src->u.syment.n_sclass)
{
#ifdef COFF_WITH_PE
if (src->u.syment.n_sclass == C_NT_WEAK)
- dst->symbol.flags = BSF_WEAK;
+ dst->symbol.flags |= BSF_WEAK;
+
if (src->u.syment.n_sclass == C_SECTION
&& src->u.syment.n_scnum > 0)
- {
- dst->symbol.flags = BSF_LOCAL;
- }
+ dst->symbol.flags = BSF_LOCAL;
#endif
-
if (src->u.syment.n_sclass == C_WEAKEXT)
- dst->symbol.flags = BSF_WEAK;
+ dst->symbol.flags |= BSF_WEAK;
break;
default:
(*_bfd_error_handler)
(_("%s: Unrecognized storage class %d for %s symbol `%s'"),
- bfd_get_filename (abfd), src->u.syment.n_sclass,
+ bfd_archive_filename (abfd), src->u.syment.n_sclass,
dst->symbol.section->name, dst->symbol.name);
dst->symbol.flags = BSF_DEBUGGING;
dst->symbol.value = (src->u.syment.n_value);
p = p->next;
}
}
- return true;
+ return TRUE;
} /* coff_slurp_symbol_table() */
/* Classify a COFF symbol. A couple of targets have globally visible
(*_bfd_error_handler)
(_("warning: %s: local symbol `%s' has no section"),
- bfd_get_filename (abfd),
+ bfd_archive_filename (abfd),
_bfd_coff_internal_syment_name (abfd, syment, buf));
}
}
#endif
-static boolean
+static bfd_boolean
coff_slurp_reloc_table (abfd, asect, symbols)
bfd * abfd;
sec_ptr asect;
RELOC *native_relocs;
arelent *reloc_cache;
arelent *cache_ptr;
-
unsigned int idx;
+ bfd_size_type amt;
if (asect->relocation)
- return true;
+ return TRUE;
if (asect->reloc_count == 0)
- return true;
+ return TRUE;
if (asect->flags & SEC_CONSTRUCTOR)
- return true;
+ return TRUE;
if (!coff_slurp_symbol_table (abfd))
- return false;
- native_relocs =
- (RELOC *) buy_and_read (abfd,
- asect->rel_filepos,
- SEEK_SET,
- (size_t) (bfd_coff_relsz (abfd) *
- asect->reloc_count));
- reloc_cache = (arelent *)
- bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
+ return FALSE;
+ amt = (bfd_size_type) bfd_coff_relsz (abfd) * asect->reloc_count;
+ native_relocs = (RELOC *) buy_and_read (abfd, asect->rel_filepos, amt);
+ amt = (bfd_size_type) asect->reloc_count * sizeof (arelent);
+ reloc_cache = (arelent *) bfd_alloc (abfd, amt);
if (reloc_cache == NULL)
- return false;
+ return FALSE;
for (idx = 0; idx < asect->reloc_count; idx++)
{
{
(*_bfd_error_handler)
(_("%s: warning: illegal symbol index %ld in relocs"),
- bfd_get_filename (abfd), dst.r_symndx);
+ bfd_archive_filename (abfd), dst.r_symndx);
cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
ptr = NULL;
}
{
(*_bfd_error_handler)
(_("%s: illegal relocation type %d at address 0x%lx"),
- bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
+ bfd_archive_filename (abfd), dst.r_type, (long) dst.r_vaddr);
bfd_set_error (bfd_error_bad_value);
- return false;
+ return FALSE;
}
}
asect->relocation = reloc_cache;
- return true;
+ return TRUE;
}
#ifndef coff_rtype_to_howto
for (; count++ < section->reloc_count;)
*relptr++ = tblptr++;
-
}
*relptr = 0;
return section->reloc_count;
}
#endif
+#ifndef coff_bfd_link_hash_table_free
+#define coff_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
+#endif
+
/* If coff_relocate_section is defined, we can use the optimized COFF
backend linker. Otherwise we must continue to use the old linker. */
#ifdef coff_relocate_section
#define coff_bfd_final_link _bfd_generic_final_link
#endif /* ! defined (coff_relocate_section) */
+#define coff_bfd_link_just_syms _bfd_generic_link_just_syms
#define coff_bfd_link_split_section _bfd_generic_link_split_section
#ifndef coff_start_final_link
#ifndef coff_link_output_has_begun
-static boolean coff_link_output_has_begun
+static bfd_boolean coff_link_output_has_begun
PARAMS ((bfd *, struct coff_final_link_info *));
-static boolean
+static bfd_boolean
coff_link_output_has_begun (abfd, info)
bfd * abfd;
struct coff_final_link_info * info ATTRIBUTE_UNUSED;
#ifndef coff_final_link_postscript
-static boolean coff_final_link_postscript
+static bfd_boolean coff_final_link_postscript
PARAMS ((bfd *, struct coff_final_link_info *));
-static boolean
+static bfd_boolean
coff_final_link_postscript (abfd, pfinfo)
bfd * abfd ATTRIBUTE_UNUSED;
struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
{
- return true;
+ return TRUE;
}
#endif
coff_SWAP_scnhdr_out,
FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
#ifdef COFF_LONG_FILENAMES
- true,
+ TRUE,
#else
- false,
+ FALSE,
#endif
#ifdef COFF_LONG_SECTION_NAMES
- true,
+ TRUE,
#else
- false,
+ FALSE,
#endif
COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
#ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
- true,
+ TRUE,
#else
- false,
+ FALSE,
#endif
#ifdef COFF_DEBUG_STRING_WIDE_PREFIX
4,
#define coff_bfd_gc_sections bfd_generic_gc_sections
#endif
+#ifndef coff_bfd_merge_sections
+#define coff_bfd_merge_sections bfd_generic_merge_sections
+#endif
+
+#ifndef coff_bfd_discard_group
+#define coff_bfd_discard_group bfd_generic_discard_group
+#endif
+
#define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
const bfd_target VAR = \
{ \