aboutsummaryrefslogtreecommitdiff
path: root/bfd/coffcode.h
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r--bfd/coffcode.h43
1 files changed, 29 insertions, 14 deletions
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index bd0374f..5cfdb2d 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -909,7 +909,9 @@ fill_comdat_hash (bfd *abfd)
if (! _bfd_coff_get_external_symbols (abfd))
return true;
- esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
+ esymstart = esym = obj_coff_external_syms (abfd);
+ if (esym == NULL)
+ return true;
esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
for (struct internal_syment isym;
@@ -1345,6 +1347,11 @@ styp_to_sec_flags (bfd *abfd,
|| startswith (name, ".sdata")))
sec_flags |= SEC_SMALL_DATA;
+ /* As there is no internal representation of the "discardable" flag,
+ reflect it by keeping SEC_ALLOC clear. */
+ if (internal_s->s_flags & IMAGE_SCN_MEM_DISCARDABLE)
+ sec_flags &= ~SEC_ALLOC;
+
#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
/* As a GNU extension, if the name begins with .gnu.linkonce, we
only link a single copy of the section. This is used to support
@@ -1425,7 +1432,7 @@ CODE_FRAGMENT
. (bfd *, void *, void *);
.
. unsigned int (*_bfd_coff_swap_scnhdr_out)
-. (bfd *, void *, void *);
+. (bfd *, void *, void *, const asection *);
.
. unsigned int _bfd_filhsz;
. unsigned int _bfd_aoutsz;
@@ -1553,8 +1560,8 @@ INTERNAL
.#define 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))
+.#define bfd_coff_swap_scnhdr_out(abfd, i, o, sec) \
+. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o, sec))
.
.#define bfd_coff_swap_filehdr_out(abfd, i,o) \
. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
@@ -3804,7 +3811,7 @@ coff_write_object_contents (bfd * abfd)
SCNHDR buff;
bfd_size_type amt = bfd_coff_scnhsz (abfd);
- if (bfd_coff_swap_scnhdr_out (abfd, &section, &buff) == 0
+ if (bfd_coff_swap_scnhdr_out (abfd, &section, &buff, current) == 0
|| bfd_write (& buff, amt, abfd) != amt)
return false;
}
@@ -3930,7 +3937,7 @@ coff_write_object_contents (bfd * abfd)
scnhdr.s_nlnno = current->target_index;
scnhdr.s_flags = STYP_OVRFLO;
amt = bfd_coff_scnhsz (abfd);
- if (bfd_coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
+ if (bfd_coff_swap_scnhdr_out (abfd, &scnhdr, &buff, current) == 0
|| bfd_write (& buff, amt, abfd) != amt)
return false;
}
@@ -5955,8 +5962,6 @@ static const bfd_coff_backend_data bigobj_swap_table =
#define coff_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
#endif
-#define coff_init_private_section_data _bfd_generic_init_private_section_data
-
#ifndef coff_bfd_copy_private_section_data
#define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
#endif
@@ -6052,6 +6057,13 @@ static const bfd_coff_backend_data bigobj_swap_table =
#define coff_bfd_define_start_stop bfd_generic_define_start_stop
#endif
+#ifdef COFF_WITH_PE
+#define PE_EXTRA_S_FLAGS (SEC_CODE | SEC_DATA | SEC_READONLY | SEC_LINK_ONCE \
+ | SEC_LINK_DUPLICATES)
+#else
+#define PE_EXTRA_S_FLAGS 0
+#endif
+
#define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE) \
const bfd_target VAR = \
{ \
@@ -6063,7 +6075,8 @@ const bfd_target VAR = \
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
/* section flags */ \
- (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
+ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \
+ | PE_EXTRA_S_FLAGS), \
UNDER, /* Leading symbol underscore. */ \
'/', /* AR_pad_char. */ \
15, /* AR_max_namelen. */ \
@@ -6125,7 +6138,8 @@ const bfd_target VAR = \
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
/* section flags */ \
- (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
+ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \
+ | PE_EXTRA_S_FLAGS), \
UNDER, /* Leading symbol underscore. */ \
'/', /* AR_pad_char. */ \
15, /* AR_max_namelen. */ \
@@ -6133,9 +6147,9 @@ const bfd_target VAR = \
TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */ \
\
/* Data conversion functions. */ \
- bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
- bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
- bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
+ bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
+ bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
+ bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
\
/* Header conversion functions. */ \
bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
@@ -6187,7 +6201,8 @@ const bfd_target VAR = \
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
/* section flags */ \
- (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
+ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS \
+ | PE_EXTRA_S_FLAGS), \
UNDER, /* Leading symbol underscore. */ \
'/', /* AR_pad_char. */ \
15, /* AR_max_namelen. */ \