diff options
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r-- | bfd/coffcode.h | 43 |
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, §ion, &buff) == 0 + if (bfd_coff_swap_scnhdr_out (abfd, §ion, &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. */ \ |