X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Fcoffcode.h;h=99bf9e521a09ffdb4c3025f05d68400f7f726750;hb=e98fe4f7b54cbdf29aef9287bbb1bea8801dd05a;hp=c46c03ae5223a8005b723eef18dc72495e2f5c14;hpb=46686c7839c7872d851d9a43df81953dbfc25dc0;p=binutils-gdb.git diff --git a/bfd/coffcode.h b/bfd/coffcode.h index c46c03ae522..99bf9e521a0 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -1,5 +1,6 @@ /* Support for the generic parts of most COFF variants, for BFD. - Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. + Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998 + Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -503,7 +504,7 @@ styp_to_sec_flags (abfd, hdr, name) 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 +#if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS) sec_flags |= SEC_DEBUGGING; #endif } @@ -861,6 +862,13 @@ dependent COFF routines: . boolean collect, . struct bfd_link_hash_entry **hashp)); . +. 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_coff_backend_data; . .#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data) @@ -975,6 +983,11 @@ dependent COFF routines: . ((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)) +.#define bfd_coff_final_link_postscript(a,p) \ +. ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p)) +. */ /* See whether the magic number matches. */ @@ -1016,6 +1029,8 @@ coff_new_section_hook (abfd, section) bfd * abfd; asection * section; { + combined_entry_type *native; + section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER; #ifdef RS6000COFF_C @@ -1032,9 +1047,21 @@ coff_new_section_hook (abfd, section) @@ The 10 is a guess at a plausible maximum number of aux entries (but shouldn't be a constant). */ - coffsymbol (section->symbol)->native = - (combined_entry_type *) bfd_zalloc (abfd, - sizeof (combined_entry_type) * 10); + native = ((combined_entry_type *) + bfd_zalloc (abfd, sizeof (combined_entry_type) * 10)); + if (native == NULL) + 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 + anyhow. However, we do need to set the type and storage class, + in case this symbol winds up getting written out. The value 0 + for n_numaux is already correct. */ + + native->u.syment.n_type = T_NULL; + native->u.syment.n_sclass = C_STAT; + + coffsymbol (section->symbol)->native = native; /* The .stab section must be aligned to 2**2 at most, because otherwise there may be gaps in the section which gdb will not @@ -1056,7 +1083,7 @@ coff_new_section_hook (abfd, section) return true; } -#ifdef I960 +#ifdef COFF_ALIGN_IN_SECTION_HEADER /* Set the alignment of a BFD section. */ @@ -1071,13 +1098,22 @@ coff_set_alignment_hook (abfd, section, scnhdr) struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; unsigned int i; +#ifdef I960 + /* Extract ALIGN from 2**ALIGN stored in section header */ for (i = 0; i < 32; i++) if ((1 << i) >= hdr->s_align) break; +#endif +/* start-sanitize-tic80 */ +#ifdef TIC80COFF + /* TI tools hijack bits 8-11 for the alignment */ + i = (hdr->s_flags >> 8) & 0xF ; +#endif +/* end-sanitize-tic80 */ section->alignment_power = i; } -#else /* ! I960 */ +#else /* ! COFF_ALIGN_IN_SECTION_HEADER */ #ifdef COFF_WITH_PE /* a couple of macros to help setting the alignment power field */ @@ -1222,7 +1258,7 @@ coff_set_alignment_hook (abfd, section, scnhdr) #endif /* ! RS6000COFF_C */ #endif /* ! COFF_WITH_PE */ -#endif /* ! I960 */ +#endif /* ! COFF_ALIGN_IN_SECTION_HEADER */ #ifndef coff_mkobject @@ -1306,9 +1342,9 @@ coff_mkobject_hook (abfd, filehdr, aouthdr) } #endif -#ifdef ARM +#ifdef ARM /* Set the flags field from the COFF header read in */ - if (! coff_arm_bfd_set_private_flags (abfd, internal_f->f_flags)) + if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags)) coff->flags = 0; #endif @@ -1385,7 +1421,7 @@ coff_set_arch_mach_hook (abfd, filehdr) case LYNXCOFFMAGIC: #endif arch = bfd_arch_m68k; - machine = 68020; + machine = bfd_mach_m68020; break; #endif #ifdef MC88MAGIC @@ -1584,11 +1620,19 @@ coff_set_arch_mach_hook (abfd, filehdr) break; #endif +#ifdef TIC30MAGIC + case TIC30MAGIC: + arch = bfd_arch_tic30; + break; +#endif + +/* start-sanitize-tic80 */ #ifdef TIC80_ARCH_MAGIC case TIC80_ARCH_MAGIC: arch = bfd_arch_tic80; break; #endif +/* end-sanitize-tic80 */ default: /* Unreadable input file type */ arch = bfd_arch_obscure; @@ -1960,6 +2004,12 @@ coff_set_flags (abfd, magicp, flagsp) } break; #endif + +#ifdef TIC30MAGIC + case bfd_arch_tic30: + *magicp = TIC30MAGIC; + return true; +#endif /* start-sanitize-tic80 */ #ifdef TIC80_ARCH_MAGIC case bfd_arch_tic80: @@ -1970,8 +2020,20 @@ coff_set_flags (abfd, magicp, flagsp) #ifdef ARMMAGIC case bfd_arch_arm: * magicp = ARMMAGIC; - if (coff_data (abfd)->flags & F_APCS_26) - * flagsp = F_APCS26; + * flagsp = 0; + if (APCS_SET (abfd)) + { + if (APCS_26_FLAG (abfd)) + * flagsp |= F_APCS26; + + if (APCS_FLOAT_FLAG (abfd)) + * flagsp |= F_APCS_FLOAT; + + if (PIC_FLAG (abfd)) + * flagsp |= F_PIC; + } + if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd)) + * flagsp |= F_INTERWORK; switch (bfd_get_mach (abfd)) { case bfd_mach_arm_2: * flagsp |= F_ARM_2; break; @@ -2134,6 +2196,15 @@ coff_set_arch_mach (abfd, arch, machine) /* Calculate the file position for each section. */ +#ifndef I960 +#define ALIGN_SECTIONS_IN_FILE +#endif +/* start-sanitize-tic80 */ +#ifdef TIC80COFF +#undef ALIGN_SECTIONS_IN_FILE +#endif +/* end-sanitize-tic80 */ + static boolean coff_compute_section_file_positions (abfd) bfd * abfd; @@ -2142,11 +2213,10 @@ coff_compute_section_file_positions (abfd) asection *previous = (asection *) NULL; file_ptr sofar = FILHSZ; boolean align_adjust; - -#ifndef I960 + unsigned int count; +#ifdef ALIGN_SECTIONS_IN_FILE file_ptr old_sofar; #endif - unsigned int count; #ifdef RS6000COFF_C /* On XCOFF, if we have symbols, set up the .debug section. */ @@ -2232,6 +2302,19 @@ coff_compute_section_file_positions (abfd) current != (asection *) NULL; current = current->next, ++count) { +#ifdef COFF_IMAGE_WITH_PE + /* The NT loader does not want empty section headers, so we omit + them. We don't actually remove the section from the BFD, + although we probably should. This matches code in + coff_write_object_contents. */ + if (current->_raw_size == 0) + { + current->target_index = -1; + --count; + continue; + } +#endif + current->target_index = count; /* Only deal with sections which have contents */ @@ -2242,7 +2325,7 @@ coff_compute_section_file_positions (abfd) which they are aligned in virtual memory. I960 doesn't do this (FIXME) so we can stay in sync with Intel. 960 doesn't yet page from files... */ -#ifndef I960 +#ifdef ALIGN_SECTIONS_IN_FILE if ((abfd->flags & EXEC_P) != 0) { /* make sure this section is aligned on the right boundary - by @@ -2293,7 +2376,7 @@ coff_compute_section_file_positions (abfd) sofar += current->_raw_size; -#ifndef I960 +#ifdef ALIGN_SECTIONS_IN_FILE /* make sure that this section is of the right size too */ if ((abfd->flags & EXEC_P) == 0) { @@ -2640,7 +2723,12 @@ coff_write_object_contents (abfd) section.s_align = (current->alignment_power ? 1 << current->alignment_power : 0); - +/* start-sanitize-tic80 */ +#else +#ifdef TIC80COFF + section.s_flags |= (current->alignment_power & 0xF) << 8; +#endif +/* end-sanitize-tic80 */ #endif #ifdef COFF_IMAGE_WITH_PE @@ -2667,13 +2755,22 @@ coff_write_object_contents (abfd) { unsigned int i, count; asymbol **psym; - coff_symbol_type *csym; + coff_symbol_type *csym = NULL; + asymbol **psymsec; + psymsec = NULL; count = bfd_get_symcount (abfd); for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++) { - /* Here *PSYM is the section symbol for CURRENT. */ + if ((*psym)->section != current) + continue; + + /* Remember the location of the first symbol in this + section. */ + if (psymsec == NULL) + psymsec = psym; + /* See if this is the section symbol. */ if (strcmp ((*psym)->name, current->name) == 0) { csym = coff_symbol_from (abfd, *psym); @@ -2683,6 +2780,9 @@ coff_write_object_contents (abfd) || csym->native->u.syment.n_sclass != C_STAT || csym->native->u.syment.n_type != T_NULL) continue; + + /* Here *PSYM is the section symbol for CURRENT. */ + break; } } @@ -2719,6 +2819,24 @@ coff_write_object_contents (abfd) IMAGE_COMDAT_SELECT_EXACT_MATCH; break; } + + /* The COMDAT symbol must be the first symbol from this + section in the symbol table. In order to make this + work, we move the COMDAT symbol before the first + symbol we found in the search above. It's OK to + rearrange the symbol table at this point, because + coff_renumber_symbols is going to rearrange it + further and fix up all the aux entries. */ + if (psym != psymsec) + { + asymbol *hold; + asymbol **pcopy; + + hold = *psym; + for (pcopy = psym; pcopy > psymsec; pcopy--) + pcopy[0] = pcopy[-1]; + *psymsec = hold; + } } } #endif /* COFF_WITH_PE */ @@ -2792,6 +2910,12 @@ coff_write_object_contents (abfd) else internal_f.f_flags |= F_AR32W; +/* start-sanitize-tic80 */ +#ifdef TIC80_TARGET_ID + internal_f.f_target_id = TIC80_TARGET_ID; +#endif +/* end-sanitize-tic80 */ + /* FIXME, should do something about the other byte orders and architectures. @@ -2829,10 +2953,12 @@ coff_write_object_contents (abfd) internal_a.magic = NMAGIC; /* Assume separate i/d */ #define __A_MAGIC_SET__ #endif /* A29K */ -#ifdef TIC80 +/* start-sanitize-tic80 */ +#ifdef TIC80COFF internal_a.magic = TIC80_ARCH_MAGIC; #define __A_MAGIC_SET__ #endif /* TIC80 */ +/* end-sanitize-tic80 */ #ifdef I860 /* FIXME: What are the a.out magic numbers for the i860? */ internal_a.magic = 0; @@ -2895,7 +3021,7 @@ coff_write_object_contents (abfd) #endif /* LYNXOS */ #endif /* SPARC */ -#if RS6000COFF_C +#ifdef RS6000COFF_C #define __A_MAGIC_SET__ internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC : (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC : @@ -3271,10 +3397,11 @@ coff_slurp_line_table (abfd, asect) warned = false; symndx = dst.l_addr.l_symndx; - if (symndx < 0 || symndx >= obj_raw_syment_count (abfd)) + if (symndx < 0 + || (unsigned long) symndx >= obj_raw_syment_count (abfd)) { (*_bfd_error_handler) - ("%s: warning: illegal symbol index %ld in line numbers", + (_("%s: warning: illegal symbol index %ld in line numbers"), bfd_get_filename (abfd), dst.l_addr.l_symndx); symndx = 0; warned = true; @@ -3288,7 +3415,7 @@ coff_slurp_line_table (abfd, asect) if (sym->lineno != NULL && ! warned) { (*_bfd_error_handler) - ("%s: warning: duplicate line number information for `%s'", + (_("%s: warning: duplicate line number information for `%s'"), bfd_get_filename (abfd), bfd_asymbol_name (&sym->symbol)); } @@ -3379,13 +3506,20 @@ coff_slurp_symbol_table (abfd) #endif case C_EXT: +#if defined ARM + case C_THUMBEXT: + case C_THUMBEXTFUNC: +#endif #ifdef RS6000COFF_C case C_HIDEXT: #endif +#ifdef C_SYSTEM + case C_SYSTEM: /* System Wide variable */ +#endif #ifdef COFF_WITH_PE /* PE uses storage class 0x68 to denote a section symbol */ case C_SECTION: - /* PE uses storage class 0x67 for a weak external symbol. */ + /* PE uses storage class 0x69 for a weak external symbol. */ case C_NT_WEAK: #endif if ((src->u.syment.n_scnum) == 0) @@ -3407,8 +3541,15 @@ coff_slurp_symbol_table (abfd) section */ dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL; + +#if defined COFF_WITH_PE + /* PE sets the symbol to a value relative to the + start of the section. */ + dst->symbol.value = src->u.syment.n_value; +#else dst->symbol.value = (src->u.syment.n_value - dst->symbol.section->vma); +#endif if (ISFCN ((src->u.syment.n_type))) { @@ -3437,6 +3578,11 @@ coff_slurp_symbol_table (abfd) case C_STAT: /* static */ #ifdef I960 case C_LEAFSTAT: /* static leaf procedure */ +#endif +#if defined ARM + case C_THUMBSTAT: /* Thumb static */ + case C_THUMBLABEL: /* Thumb label */ + case C_THUMBSTATFUNC:/* Thumb static function */ #endif case C_LABEL: /* label */ if (src->u.syment.n_scnum == -2) @@ -3447,8 +3593,16 @@ coff_slurp_symbol_table (abfd) /* Base the value as an index from the base of the section, if there is one. */ if (dst->symbol.section) - dst->symbol.value = (src->u.syment.n_value - - dst->symbol.section->vma); + { +#if defined COFF_WITH_PE + /* PE sets the symbol to a value relative to the + start of the section. */ + dst->symbol.value = src->u.syment.n_value; +#else + dst->symbol.value = (src->u.syment.n_value + - dst->symbol.section->vma); +#endif + } else dst->symbol.value = src->u.syment.n_value; break; @@ -3462,9 +3616,15 @@ coff_slurp_symbol_table (abfd) #endif case C_REGPARM: /* register parameter */ case C_REG: /* register variable */ +/* start-sanitize-tic80 */ +#ifndef TIC80COFF +/* end-sanitize-tic80 */ #ifdef C_AUTOARG case C_AUTOARG: /* 960-specific storage class */ #endif +/* start-sanitize-tic80 */ +#endif +/* end-sanitize-tic80 */ case C_TPDEF: /* type definition */ case C_ARG: case C_AUTO: /* automatic variable */ @@ -3544,10 +3704,16 @@ coff_slurp_symbol_table (abfd) case C_FCN: /* ".bf" or ".ef" */ case C_EFCN: /* physical end of function */ dst->symbol.flags = BSF_LOCAL; +#if defined COFF_WITH_PE + /* PE sets the symbol to a value relative to the start + of the section. */ + dst->symbol.value = src->u.syment.n_value; +#else /* Base the value as an index from the base of the section. */ dst->symbol.value = (src->u.syment.n_value - dst->symbol.section->vma); +#endif break; case C_NULL: @@ -3561,10 +3727,18 @@ coff_slurp_symbol_table (abfd) /* NT uses 0x67 for a weak symbol, not C_ALIAS. */ case C_ALIAS: /* duplicate tag */ #endif +/* start-sanitize-tic80 */ + /* New storage classes for TIc80 */ +#ifdef TIC80COFF + case C_UEXT: /* Tentative external definition */ +#endif + case C_STATLAB: /* Static load time label */ + case C_EXTLAB: /* External load time label */ +/* end-sanitize-tic80 */ case C_HIDDEN: /* ext symbol in dmert public lib */ default: (*_bfd_error_handler) - ("%s: Unrecognized storage class %d for %s symbol `%s'", + (_("%s: Unrecognized storage class %d for %s symbol `%s'"), bfd_get_filename (abfd), src->u.syment.n_sclass, dst->symbol.section->name, dst->symbol.name); dst->symbol.flags = BSF_DEBUGGING; @@ -3613,9 +3787,13 @@ coff_slurp_symbol_table (abfd) #define OTHER_GLOBAL_CLASS C_LEAFEXT #endif +#ifdef COFFARM +#define OTHER_GLOBAL_CLASS C_THUMBEXT || syment->n_sclass == C_THUMBEXTFUNC +#else #ifdef COFF_WITH_PE #define OTHER_GLOBAL_CLASS C_SECTION #endif +#endif #ifdef OTHER_GLOBAL_CLASS @@ -3623,12 +3801,10 @@ static boolean coff_sym_is_global PARAMS ((bfd *, struct internal_syment *)); static boolean coff_sym_is_global (abfd, syment) - bfd *abfd; - struct internal_syment *syment; + bfd * abfd; + struct internal_syment * syment; { - if (syment->n_sclass == OTHER_GLOBAL_CLASS) - return true; - return false; + return (syment->n_sclass == OTHER_GLOBAL_CLASS); } #undef OTHER_GLOBAL_CLASS @@ -3746,7 +3922,7 @@ coff_slurp_reloc_table (abfd, asect, symbols) if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd)) { (*_bfd_error_handler) - ("%s: warning: illegal symbol index %ld in relocs", + (_("%s: warning: illegal symbol index %ld in relocs"), bfd_get_filename (abfd), dst.r_symndx); cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; ptr = NULL; @@ -3784,7 +3960,7 @@ coff_slurp_reloc_table (abfd, asect, symbols) if (cache_ptr->howto == NULL) { (*_bfd_error_handler) - ("%s: illegal relocation type %d at address 0x%lx", + (_("%s: illegal relocation type %d at address 0x%lx"), bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr); bfd_set_error (bfd_error_bad_value); return false; @@ -3964,13 +4140,80 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr, #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol #endif +#ifndef coff_link_output_has_begun +#define coff_link_output_has_begun _coff_link_output_has_begun +static boolean +_coff_link_output_has_begun (abfd, info) + bfd * abfd; + struct bfd_link_info * info; +{ + return abfd->output_has_begun; +} +#endif + +#ifndef coff_final_link_postscript +#define coff_final_link_postscript _coff_final_link_postscript +static boolean +_coff_final_link_postscript (abfd, pfinfo) + bfd * abfd; + struct coff_final_link_info * pfinfo; +{ + return true; +} +#endif + +#ifndef coff_SWAP_aux_in +#define coff_SWAP_aux_in coff_swap_aux_in +#endif +#ifndef coff_SWAP_sym_in +#define coff_SWAP_sym_in coff_swap_sym_in +#endif +#ifndef coff_SWAP_lineno_in +#define coff_SWAP_lineno_in coff_swap_lineno_in +#endif +#ifndef coff_SWAP_aux_out +#define coff_SWAP_aux_out coff_swap_aux_out +#endif +#ifndef coff_SWAP_sym_out +#define coff_SWAP_sym_out coff_swap_sym_out +#endif +#ifndef coff_SWAP_lineno_out +#define coff_SWAP_lineno_out coff_swap_lineno_out +#endif +#ifndef coff_SWAP_reloc_out +#define coff_SWAP_reloc_out coff_swap_reloc_out +#endif +#ifndef coff_SWAP_filehdr_out +#define coff_SWAP_filehdr_out coff_swap_filehdr_out +#endif +#ifndef coff_SWAP_aouthdr_out +#define coff_SWAP_aouthdr_out coff_swap_aouthdr_out +#endif +#ifndef coff_SWAP_scnhdr_out +#define coff_SWAP_scnhdr_out coff_swap_scnhdr_out +#endif +#ifndef coff_SWAP_reloc_in +#define coff_SWAP_reloc_in coff_swap_reloc_in +#endif +#ifndef coff_SWAP_filehdr_in +#define coff_SWAP_filehdr_in coff_swap_filehdr_in +#endif +#ifndef coff_SWAP_aouthdr_in +#define coff_SWAP_aouthdr_in coff_swap_aouthdr_in +#endif +#ifndef coff_SWAP_scnhdr_in +#define coff_SWAP_scnhdr_in coff_swap_scnhdr_in +#endif + + + static CONST bfd_coff_backend_data bfd_coff_std_swap_table = { - coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, - coff_swap_aux_out, coff_swap_sym_out, - coff_swap_lineno_out, coff_swap_reloc_out, - coff_swap_filehdr_out, coff_swap_aouthdr_out, - coff_swap_scnhdr_out, + coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in, + coff_SWAP_aux_out, coff_SWAP_sym_out, + coff_SWAP_lineno_out, coff_SWAP_reloc_out, + coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out, + coff_SWAP_scnhdr_out, FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, #ifdef COFF_LONG_FILENAMES true, @@ -3983,14 +4226,15 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table = false, #endif COFF_DEFAULT_SECTION_ALIGNMENT_POWER, - coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in, - coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, + coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, + coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook, coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate, coff_sym_is_global, coff_compute_section_file_positions, coff_start_final_link, coff_relocate_section, coff_rtype_to_howto, - coff_adjust_symndx, coff_link_add_one_symbol + coff_adjust_symndx, coff_link_add_one_symbol, + coff_link_output_has_begun, coff_final_link_postscript }; #ifndef coff_close_and_cleanup @@ -4055,3 +4299,7 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table = #ifndef coff_bfd_relax_section #define coff_bfd_relax_section bfd_generic_relax_section #endif + +#ifndef coff_bfd_gc_sections +#define coff_bfd_gc_sections bfd_generic_gc_sections +#endif