From e8fbe6d9249ba4c01d42e7c1d20bd5b9e7091e66 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 15 Aug 1994 16:26:06 +0000 Subject: [PATCH] * coffcode.h (styp_to_sec_flags): Add name argument. If no flags are recognized, chose section flags based on the name. (bfd_coff_backend_data): _bfd_styp_to_sec_flags_hook field: Add name argument. (bfd_coff_styp_to_sec_flags_hook): Add name argument. (coff_compute_section_file_positions): Don't adjust the section position by COFF_PAGE_SIZE unless SEC_ALLOC is set. * libcoff.h: Rebuilt. * coffgen.c (make_a_section_from_file): Pass section name to bfd_coff_styp_to_sec_flags_hook. * ecoff.c (_bfd_ecoff_styp_to_sec_flags): Add unused name argument. * libecoff.h (_bfd_ecoff_styp_to_sec_flags): Add name argument to prototype. --- bfd/ChangeLog | 17 ++++++++++++ bfd/coffcode.h | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++------- bfd/coffgen.c | 22 +++++++-------- bfd/libcoff.h | 11 ++++---- bfd/libecoff.h | 5 ++-- 5 files changed, 111 insertions(+), 28 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3f1d2ca..e49850b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,20 @@ +Mon Aug 15 12:16:56 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * coffcode.h (styp_to_sec_flags): Add name argument. If no flags + are recognized, chose section flags based on the name. + (bfd_coff_backend_data): _bfd_styp_to_sec_flags_hook field: Add + name argument. + (bfd_coff_styp_to_sec_flags_hook): Add name argument. + (coff_compute_section_file_positions): Don't adjust the section + position by COFF_PAGE_SIZE unless SEC_ALLOC is set. + * libcoff.h: Rebuilt. + * coffgen.c (make_a_section_from_file): Pass section name to + bfd_coff_styp_to_sec_flags_hook. + * ecoff.c (_bfd_ecoff_styp_to_sec_flags): Add unused name + argument. + * libecoff.h (_bfd_ecoff_styp_to_sec_flags): Add name argument to + prototype. + Fri Aug 12 11:22:40 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) * elfcode.h (section_from_elf_index): Correct check for invalid diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 3e208e2..0eed749 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -405,9 +405,10 @@ sec_to_styp_flags (sec_name, sec_flags) * in sec_to_styp_flags(). */ static flagword -styp_to_sec_flags (abfd, hdr) - bfd * abfd; +styp_to_sec_flags (abfd, hdr, name) + bfd *abfd; PTR hdr; + const char *name; { struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; long styp_flags = internal_s->s_flags; @@ -457,6 +458,54 @@ styp_to_sec_flags (abfd, hdr) sec_flags |= SEC_DEBUGGING; #endif } + else if (strcmp (name, _TEXT) == 0) + { + if (sec_flags & SEC_NEVER_LOAD) + sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; + else + sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; + } + else if (strcmp (name, _DATA) == 0 +#ifdef TWO_DATA_SECS + || strcmp (name, ".data2") == 0 +#endif + ) + { + if (sec_flags & SEC_NEVER_LOAD) + sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; + else + sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; + } + else if (strcmp (name, _BSS) == 0) + { +#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY + if (sec_flags & SEC_NEVER_LOAD) + sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY; + else +#endif + sec_flags |= SEC_ALLOC; + } + else if (strcmp (name, ".debug") == 0 +#ifdef _COMMENT + || strcmp (name, _COMMENT) == 0 +#endif + || strcmp (name, ".stab") == 0 + || strcmp (name, ".stabstr") == 0) + { +#ifdef COFF_PAGE_SIZE + sec_flags |= SEC_DEBUGGING; +#endif + } +#ifdef _LIB + else if (strcmp (name, _LIB) == 0) + ; +#endif +#ifdef _LIT + else if (strcmp (name, _LIT) == 0) + { + sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY; + } +#endif else { sec_flags |= SEC_ALLOC | SEC_LOAD; @@ -585,7 +634,8 @@ dependent COFF routines: . PTR internal_aouthdr)); . flagword (*_bfd_styp_to_sec_flags_hook) PARAMS (( . bfd *abfd, -. PTR internal_scnhdr)); +. PTR internal_scnhdr, +. const char *name)); . asection *(*_bfd_make_section_hook) PARAMS (( . bfd *abfd, . char *name)); @@ -671,8 +721,8 @@ dependent COFF routines: .#define 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)\ -. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr)) +.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name)\ +. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr, name)) . .#define bfd_coff_make_section_hook(abfd, name)\ . ((coff_backend_info (abfd)->_bfd_make_section_hook) (abfd, name)) @@ -1378,7 +1428,8 @@ coff_compute_section_file_positions (abfd) #ifdef COFF_PAGE_SIZE /* In demand paged files the low order bits of the file offset must match the low order bits of the virtual address. */ - if ((abfd->flags & D_PAGED) != 0) + if ((abfd->flags & D_PAGED) != 0 + && (current->flags & SEC_ALLOC) != 0) sofar += (current->vma - sofar) % COFF_PAGE_SIZE; #endif @@ -1771,16 +1822,29 @@ coff_write_object_contents (abfd) internal_a.magic = APOLLO_COFF_VERSION_NUMBER; #endif -#if M68 || WE32K +#if defined(M68) || defined(WE32K) || defined(M68K) #define __A_MAGIC_SET__ - /* Never was anything here for the 68k */ -#endif /* M68 || WE32K */ +#if defined(LYNXOS) + internal_a.magic = LYNXCOFFMAGIC; +#endif /* LYNXOS */ +#endif /* M68 || WE32K || M68K */ -#if I386 +#if defined(I386) #define __A_MAGIC_SET__ +#if defined(LYNXOS) + internal_a.magic = LYNXCOFFMAGIC; +#else /* LYNXOS */ internal_a.magic = ZMAGIC; +#endif /* LYNXOS */ #endif /* I386 */ +#if defined(SPARC) +#define __A_MAGIC_SET__ +#if defined(LYNXOS) + internal_a.magic = LYNXCOFFMAGIC; +#endif /* LYNXOS */ +#endif /* SPARC */ + #if RS6000COFF_C #define __A_MAGIC_SET__ internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC : diff --git a/bfd/coffgen.c b/bfd/coffgen.c index 33a85cf..2e1ad2d 100644 --- a/bfd/coffgen.c +++ b/bfd/coffgen.c @@ -99,7 +99,7 @@ make_a_section_from_file (abfd, hdr, target_index) return_section->lineno_count = hdr->s_nlnno; return_section->userdata = NULL; return_section->next = (asection *) NULL; - return_section->flags = bfd_coff_styp_to_sec_flags_hook (abfd, hdr); + return_section->flags = bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name); return_section->target_index = target_index; @@ -254,7 +254,7 @@ coff_object_p (abfd) /* Get the BFD section from a COFF symbol section number. */ -struct sec * +asection * coff_section_from_bfd_index (abfd, index) bfd *abfd; int index; @@ -263,11 +263,11 @@ coff_section_from_bfd_index (abfd, index) if (index == N_ABS) { - return &bfd_abs_section; + return bfd_abs_section_ptr; } if (index == N_UNDEF) { - return &bfd_und_section; + return bfd_und_section_ptr; } if(index == N_DEBUG) { @@ -283,7 +283,7 @@ coff_section_from_bfd_index (abfd, index) /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a has a bad symbol table in biglitpow.o. */ - return &bfd_und_section; + return bfd_und_section_ptr; } /* Get the upper bound of a COFF symbol table. */ @@ -410,7 +410,7 @@ fixup_symbol_value (coff_symbol_ptr, syment) else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) { syment->n_value = coff_symbol_ptr->symbol.value; } - else if (coff_symbol_ptr->symbol.section == & bfd_und_section) { + else if (bfd_is_und_section (coff_symbol_ptr->symbol.section)) { syment->n_scnum = N_UNDEF; syment->n_value = 0; } @@ -472,10 +472,10 @@ coff_renumber_symbols (bfd_ptr) } bfd_ptr->outsymbols = newsyms; for (i = 0; i < symbol_count; i++) - if (symbol_ptr_ptr[i]->section != &bfd_und_section) + if (! bfd_is_und_section (symbol_ptr_ptr[i]->section)) *newsyms++ = symbol_ptr_ptr[i]; for (i = 0; i < symbol_count; i++) - if (symbol_ptr_ptr[i]->section == &bfd_und_section) + if (bfd_is_und_section (symbol_ptr_ptr[i]->section)) *newsyms++ = symbol_ptr_ptr[i]; *newsyms = (asymbol *) NULL; symbol_ptr_ptr = bfd_ptr->outsymbols; @@ -685,7 +685,7 @@ coff_write_symbol (abfd, symbol, native, written) if (native->u.syment.n_sclass == C_FILE) symbol->section = &bfd_debug_section; - if (symbol->section == &bfd_abs_section) + if (bfd_is_abs_section (symbol->section)) { native->u.syment.n_scnum = N_ABS; } @@ -693,7 +693,7 @@ coff_write_symbol (abfd, symbol, native, written) { native->u.syment.n_scnum = N_DEBUG; } - else if (symbol->section == &bfd_und_section) + else if (bfd_is_und_section (symbol->section)) { native->u.syment.n_scnum = N_UNDEF; } @@ -767,7 +767,7 @@ coff_write_alien_symbol (abfd, symbol, written) native = &dummy; native->u.syment.n_type = T_NULL; native->u.syment.n_flags = 0; - if (symbol->section == &bfd_und_section) + if (bfd_is_und_section (symbol->section)) { native->u.syment.n_scnum = N_UNDEF; native->u.syment.n_value = symbol->value; diff --git a/bfd/libcoff.h b/bfd/libcoff.h index 83d5468..0ffb49f 100644 --- a/bfd/libcoff.h +++ b/bfd/libcoff.h @@ -75,7 +75,7 @@ typedef struct coff_tdata #define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd))) /* Functions in coffgen.c. */ -extern bfd_target *coff_object_p PARAMS ((bfd *)); +extern const bfd_target *coff_object_p PARAMS ((bfd *)); extern struct sec *coff_section_from_bfd_index PARAMS ((bfd *, int)); extern long coff_get_symtab_upper_bound PARAMS ((bfd *)); extern long coff_get_symtab PARAMS ((bfd *, asymbol **)); @@ -83,7 +83,7 @@ extern int coff_count_linenumbers PARAMS ((bfd *)); extern struct coff_symbol_struct *coff_symbol_from PARAMS ((bfd *, asymbol *)); extern boolean coff_renumber_symbols PARAMS ((bfd *)); extern void coff_mangle_symbols PARAMS ((bfd *)); -extern void coff_write_symbols PARAMS ((bfd *)); +extern boolean coff_write_symbols PARAMS ((bfd *)); extern boolean coff_write_linenumbers PARAMS ((bfd *)); extern alent *coff_get_lineno PARAMS ((bfd *, asymbol *)); extern asymbol *coff_section_symbol PARAMS ((bfd *, char *)); @@ -258,7 +258,8 @@ typedef struct PTR internal_aouthdr)); flagword (*_bfd_styp_to_sec_flags_hook) PARAMS (( bfd *abfd, - PTR internal_scnhdr)); + PTR internal_scnhdr, + const char *name)); asection *(*_bfd_make_section_hook) PARAMS (( bfd *abfd, char *name)); @@ -344,8 +345,8 @@ typedef struct #define 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)\ - ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr)) +#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name)\ + ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr, name)) #define bfd_coff_make_section_hook(abfd, name)\ ((coff_backend_info (abfd)->_bfd_make_section_hook) (abfd, name)) diff --git a/bfd/libecoff.h b/bfd/libecoff.h index 3ff4789..a6b8777 100644 --- a/bfd/libecoff.h +++ b/bfd/libecoff.h @@ -229,7 +229,7 @@ extern boolean _bfd_ecoff_slurp_symbolic_info /* Generic ECOFF BFD backend vectors. */ extern boolean _bfd_ecoff_write_object_contents PARAMS ((bfd *abfd)); -extern bfd_target *_bfd_ecoff_archive_p PARAMS ((bfd *abfd)); +extern const bfd_target *_bfd_ecoff_archive_p PARAMS ((bfd *abfd)); #define _bfd_ecoff_close_and_cleanup _bfd_generic_close_and_cleanup #define _bfd_ecoff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info @@ -293,5 +293,6 @@ extern asection *_bfd_ecoff_make_section_hook PARAMS ((bfd *abfd, char *name)); #define _bfd_ecoff_set_alignment_hook \ ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void) extern boolean _bfd_ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr)); -extern flagword _bfd_ecoff_styp_to_sec_flags PARAMS ((bfd *abfd, PTR hdr)); +extern flagword _bfd_ecoff_styp_to_sec_flags + PARAMS ((bfd *abfd, PTR hdr, const char *name)); extern boolean _bfd_ecoff_slurp_symbol_table PARAMS ((bfd *abfd)); -- 2.7.4