From f0abc2a11f47c3ecdfe0b54421092d17c70fc5f2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 23 Jan 2003 11:51:35 +0000 Subject: include/elf/ChangeLog * sh.h: Split out various bits to bfd/elf32-sh64.h. include/opcode/ChangeLog * m68hc11.h (cpu6812s): Define. bfd/ChangeLog * elf-bfd.h (struct bfd_elf_section_data): Remove tdata. Change dynindx to an int. Rearrange for better packing. * elf.c (_bfd_elf_new_section_hook): Don't alloc if already done. * elf32-mips.c (bfd_elf32_new_section_hook): Define. * elf32-sh64.h: New. Split out from include/elf/sh.h. (struct _sh64_elf_section_data): New struct. (sh64_elf_section_data): Don't dereference sh64_info (was tdata). * elf32-sh64-com.c: Include elf32-sh64.h. * elf32-sh64.c: Likewise. (sh64_elf_new_section_hook): New function. (bfd_elf32_new_section_hook): Define. (sh64_elf_fake_sections): Adjust for sh64_elf_section_data change. (sh64_bfd_elf_copy_private_section_data): Likewise. (sh64_elf_final_write_processing): Likewise. * elf32-sparc.c (struct elf32_sparc_section_data): New. (elf32_sparc_new_section_hook): New function. (SET_SEC_DO_RELAX, SEC_DO_RELAX): Delete. (sec_do_relax): Define. (elf32_sparc_relax_section): Adjust to use sec_do_relax. (elf32_sparc_relocate_section): Likewise. * elf64-mips.c (bfd_elf64_new_section_hook): Define. * elf64-mmix.c (struct _mmix_elf_section_data): New. (mmix_elf_section_data): Define. Use throughout file. (mmix_elf_new_section_hook): New function. (bfd_elf64_new_section_hook): Define. * elf64-ppc.c (struct _ppc64_elf_section_data): New. (ppc64_elf_section_data): Define. Use throughout. (ppc64_elf_new_section_hook): New function. (bfd_elf64_new_section_hook): Define. * elf64-sparc.c (struct sparc64_elf_section_data): New. (sparc64_elf_new_section_hook): New function. (SET_SEC_DO_RELAX, SEC_DO_RELAX): Delete. (sec_do_relax): Define. (sparc64_elf_relax_section): Adjust to use sec_do_relax. (sparc64_elf_relocate_section): Likewise. (bfd_elf64_new_section_hook): Define. * elfn32-mips.c (bfd_elf32_new_section_hook): Define. * elfxx-mips.c (struct _mips_elf_section_data): New. (mips_elf_section_data): Define. Use throughout. (_bfd_mips_elf_new_section_hook): New function. (mips_elf_create_got_section): Don't alloc used_by_bfd. * elfxx-mips.h (_bfd_mips_elf_new_section_hook): Declare. * elfxx-target.h (bfd_elfNN_new_section_hook): Add #ifndef. * Makefile.am: Run "make dep-am". * Makefile.in: Regenerate. opcodes/ChangeLog * sh64-dis.c: Include elf32-sh64.h. * Makefile.am: Run "make dep-am". * Makefile.in: Regenerate. gas/ChangeLog * config/tc-sh64.c (shmedia_frob_section_type): Adjust for changed sh64_elf_section_data. * config/tc-sh64.h: Include elf32-sh64.h. * config/tc-m68hc11.c: Don't include stdio.h. (md_show_usage): Fix missing continuation. * Makefile.am: Run "make dep-am". * Makefile.in: Regenerate. ld/ChangeLog * emultempl/sh64elf.em: Include elf32-sh64.h. (sh64_elf_${EMULATION_NAME}_before_allocation): Adjust for changed sh64_elf_section_data. (sh64_elf_${EMULATION_NAME}_after_allocation): Likewise. --- bfd/ChangeLog | 48 +++++++++++++++++++++++++++++ bfd/Makefile.am | 4 +-- bfd/Makefile.in | 4 +-- bfd/elf-bfd.h | 37 +++++++++++------------ bfd/elf.c | 18 ++++++----- bfd/elf32-mips.c | 5 ++-- bfd/elf32-sh64-com.c | 3 +- bfd/elf32-sh64.c | 33 ++++++++++++++++---- bfd/elf32-sh64.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ bfd/elf32-sparc.c | 36 ++++++++++++++++++---- bfd/elf64-mips.c | 3 +- bfd/elf64-mmix.c | 75 ++++++++++++++++++++++++++++++---------------- bfd/elf64-ppc.c | 48 ++++++++++++++++++++++++----- bfd/elf64-sparc.c | 38 +++++++++++++++++++---- bfd/elfn32-mips.c | 1 + bfd/elfxx-mips.c | 85 ++++++++++++++++++++++++++++++++-------------------- bfd/elfxx-mips.h | 4 ++- bfd/elfxx-target.h | 6 ++-- 18 files changed, 411 insertions(+), 120 deletions(-) create mode 100644 bfd/elf32-sh64.h (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f292935c02..2bfec170a8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,51 @@ +2003-01-23 Alan Modra + + * elf-bfd.h (struct bfd_elf_section_data): Remove tdata. Change + dynindx to an int. Rearrange for better packing. + * elf.c (_bfd_elf_new_section_hook): Don't alloc if already done. + * elf32-mips.c (bfd_elf32_new_section_hook): Define. + * elf32-sh64.h: New. Split out from include/elf/sh.h. + (struct _sh64_elf_section_data): New struct. + (sh64_elf_section_data): Don't dereference sh64_info (was tdata). + * elf32-sh64-com.c: Include elf32-sh64.h. + * elf32-sh64.c: Likewise. + (sh64_elf_new_section_hook): New function. + (bfd_elf32_new_section_hook): Define. + (sh64_elf_fake_sections): Adjust for sh64_elf_section_data change. + (sh64_bfd_elf_copy_private_section_data): Likewise. + (sh64_elf_final_write_processing): Likewise. + * elf32-sparc.c (struct elf32_sparc_section_data): New. + (elf32_sparc_new_section_hook): New function. + (SET_SEC_DO_RELAX, SEC_DO_RELAX): Delete. + (sec_do_relax): Define. + (elf32_sparc_relax_section): Adjust to use sec_do_relax. + (elf32_sparc_relocate_section): Likewise. + * elf64-mips.c (bfd_elf64_new_section_hook): Define. + * elf64-mmix.c (struct _mmix_elf_section_data): New. + (mmix_elf_section_data): Define. Use throughout file. + (mmix_elf_new_section_hook): New function. + (bfd_elf64_new_section_hook): Define. + * elf64-ppc.c (struct _ppc64_elf_section_data): New. + (ppc64_elf_section_data): Define. Use throughout. + (ppc64_elf_new_section_hook): New function. + (bfd_elf64_new_section_hook): Define. + * elf64-sparc.c (struct sparc64_elf_section_data): New. + (sparc64_elf_new_section_hook): New function. + (SET_SEC_DO_RELAX, SEC_DO_RELAX): Delete. + (sec_do_relax): Define. + (sparc64_elf_relax_section): Adjust to use sec_do_relax. + (sparc64_elf_relocate_section): Likewise. + (bfd_elf64_new_section_hook): Define. + * elfn32-mips.c (bfd_elf32_new_section_hook): Define. + * elfxx-mips.c (struct _mips_elf_section_data): New. + (mips_elf_section_data): Define. Use throughout. + (_bfd_mips_elf_new_section_hook): New function. + (mips_elf_create_got_section): Don't alloc used_by_bfd. + * elfxx-mips.h (_bfd_mips_elf_new_section_hook): Declare. + * elfxx-target.h (bfd_elfNN_new_section_hook): Add #ifndef. + * Makefile.am: Run "make dep-am". + * Makefile.in: Regenerate. + 2003-01-21 Richard Henderson * elf64-alpha.c (ALPHA_ELF_LINK_HASH_PLT_LOC): New. diff --git a/bfd/Makefile.am b/bfd/Makefile.am index d6c6aa0a77..bc92764c9a 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -1253,12 +1253,12 @@ elf32-ppc.lo: elf32-ppc.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ elf32-sh64.lo: elf32-sh64.c $(INCDIR)/filenames.h elf-bfd.h \ $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ $(INCDIR)/bfdlink.h $(srcdir)/../opcodes/sh64-opc.h \ - elf32-sh.c $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \ + elf32-sh64.h elf32-sh.c $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \ elf32-target.h elf32-sh64-com.lo: elf32-sh64-com.c $(INCDIR)/filenames.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/sh.h \ - $(INCDIR)/elf/reloc-macros.h $(srcdir)/../opcodes/sh64-opc.h + $(INCDIR)/elf/reloc-macros.h elf32-sh64.h $(srcdir)/../opcodes/sh64-opc.h elf32-s390.lo: elf32-s390.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/elf/s390.h $(INCDIR)/elf/reloc-macros.h \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 1d6c04db39..f3a9830b89 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -1786,12 +1786,12 @@ elf32-ppc.lo: elf32-ppc.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ elf32-sh64.lo: elf32-sh64.c $(INCDIR)/filenames.h elf-bfd.h \ $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ $(INCDIR)/bfdlink.h $(srcdir)/../opcodes/sh64-opc.h \ - elf32-sh.c $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \ + elf32-sh64.h elf32-sh.c $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \ elf32-target.h elf32-sh64-com.lo: elf32-sh64-com.c $(INCDIR)/filenames.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/sh.h \ - $(INCDIR)/elf/reloc-macros.h $(srcdir)/../opcodes/sh64-opc.h + $(INCDIR)/elf/reloc-macros.h elf32-sh64.h $(srcdir)/../opcodes/sh64-opc.h elf32-s390.lo: elf32-s390.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ $(INCDIR)/elf/external.h $(INCDIR)/elf/s390.h $(INCDIR)/elf/reloc-macros.h \ diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 8e5e024edc..394f70cd02 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1,6 +1,6 @@ /* BFD back-end data structures for ELF files. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002 Free Software Foundation, Inc. + 2002, 2003 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -941,13 +941,6 @@ struct bfd_elf_section_data /* The number of relocations currently assigned to REL_HDR2. */ unsigned int rel_count2; - /* A pointer to a linked list tracking dynamic relocs copied for - local symbols. */ - PTR local_dynrel; - - /* A pointer to the bfd section used for dynamic relocs. */ - asection *sreloc; - /* The ELF section number of this section. Only used for an output file. */ int this_idx; @@ -960,6 +953,12 @@ struct bfd_elf_section_data REL_HDR2 if any. Only used for an output file. */ int rel_idx2; + /* Used by the backend linker when generating a shared library to + record the dynamic symbol index for a section symbol + corresponding to this section. A value of 0 means that there is + no dynamic symbol for this section. */ + int dynindx; + /* Used by the backend linker to store the symbol hash table entries associated with relocs against global symbols. */ struct elf_link_hash_entry **rel_hashes; @@ -969,17 +968,12 @@ struct bfd_elf_section_data pointer may be NULL. It is used by the backend linker. */ Elf_Internal_Rela *relocs; - /* Used by the backend linker when generating a shared library to - record the dynamic symbol index for a section symbol - corresponding to this section. A value of 0 means that there is - no dynamic symbol for this section. */ - long dynindx; - - /* A pointer used for various section optimizations. */ - PTR sec_info; + /* A pointer to a linked list tracking dynamic relocs copied for + local symbols. */ + PTR local_dynrel; - /* Type of that information. */ - enum elf_link_info_type sec_info_type; + /* A pointer to the bfd section used for dynamic relocs. */ + asection *sreloc; union { /* Group name, if this section is a member of a group. */ @@ -993,8 +987,11 @@ struct bfd_elf_section_data the linker. */ asection *next_in_group; - /* A pointer available for the processor specific ELF backend. */ - PTR tdata; + /* A pointer used for various section optimizations. */ + PTR sec_info; + + /* Type of sec_info information. */ + enum elf_link_info_type sec_info_type; /* Nonzero if this section uses RELA relocations, rather than REL. */ unsigned int use_rela_p:1; diff --git a/bfd/elf.c b/bfd/elf.c index 22349bd709..7c209715a1 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1,6 +1,6 @@ /* ELF executable support for BFD. - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -2136,12 +2136,16 @@ _bfd_elf_new_section_hook (abfd, sec) asection *sec; { struct bfd_elf_section_data *sdata; - bfd_size_type amt = sizeof (*sdata); - sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd, amt); - if (!sdata) - return FALSE; - sec->used_by_bfd = (PTR) sdata; + sdata = (struct bfd_elf_section_data *) sec->used_by_bfd; + if (sdata == NULL) + { + bfd_size_type amt = sizeof (*sdata); + sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + } /* Indicate whether or not this section should use RELA relocations. */ sdata->use_rela_p diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 485bd2cc2f..1399f00312 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -1,6 +1,6 @@ /* MIPS-specific support for 32-bit ELF - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003 Free Software Foundation, Inc. Most of the information added by Ian Lance Taylor, Cygnus Support, . @@ -1917,6 +1917,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define bfd_elf32_bfd_is_local_label_name \ mips_elf_is_local_label_name #define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line +#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents #define bfd_elf32_bfd_get_relocated_section_contents \ _bfd_elf_mips_get_relocated_section_contents diff --git a/bfd/elf32-sh64-com.c b/bfd/elf32-sh64-com.c index d89d7c7fc5..107e50490b 100644 --- a/bfd/elf32-sh64-com.c +++ b/bfd/elf32-sh64-com.c @@ -1,5 +1,5 @@ /* Hitachi SH64-specific support for 32-bit ELF - Copyright 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -24,6 +24,7 @@ #include "libbfd.h" #include "elf-bfd.h" #include "elf/sh.h" +#include "elf32-sh64.h" #include "../opcodes/sh64-opc.h" static bfd_boolean sh64_address_in_cranges diff --git a/bfd/elf32-sh64.c b/bfd/elf32-sh64.c index 492fd73347..13953e6461 100644 --- a/bfd/elf32-sh64.c +++ b/bfd/elf32-sh64.c @@ -23,6 +23,7 @@ #include "sysdep.h" #include "elf-bfd.h" #include "../opcodes/sh64-opc.h" +#include "elf32-sh64.h" /* Add a suffix for datalabel indirection symbols. It must not match any other symbols; user symbols with or without version or other @@ -37,6 +38,8 @@ struct sh64_find_section_vma_data bfd_vma addr; }; +static bfd_boolean sh64_elf_new_section_hook + PARAMS ((bfd *, asection *)); static bfd_boolean sh64_elf_copy_private_data PARAMS ((bfd *, bfd *)); static bfd_boolean sh64_elf_merge_private_data @@ -85,6 +88,8 @@ static void sh64_find_section_for_address #define elf_backend_final_write_processing sh64_elf_final_write_processing #define elf_backend_section_from_shdr sh64_backend_section_from_shdr +#define bfd_elf32_new_section_hook sh64_elf_new_section_hook + /* For objcopy, we need to set up sh64_elf_section_data (asection *) from incoming section flags. This is otherwise done in sh64elf.em when linking or tc-sh64.c when assembling. */ @@ -100,6 +105,24 @@ static void sh64_find_section_for_address #define INCLUDE_SHMEDIA #include "elf32-sh.c" +/* Tack some extra info on struct bfd_elf_section_data. */ + +static bfd_boolean +sh64_elf_new_section_hook (abfd, sec) + bfd *abfd; + asection *sec; +{ + struct _sh64_elf_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); + + sdata = (struct _sh64_elf_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + + return _bfd_elf_new_section_hook (abfd, sec); +} + /* Set the SHF_SH5_ISA32 flag for ISA SHmedia code sections, and pass through SHT_SH5_CR_SORTED on a sorted .cranges section. */ @@ -109,9 +132,9 @@ sh64_elf_fake_sections (output_bfd, elf_section_hdr, asect) Elf_Internal_Shdr *elf_section_hdr; asection *asect; { - if (sh64_elf_section_data (asect) != NULL) + if (sh64_elf_section_data (asect)->sh64_info != NULL) elf_section_hdr->sh_flags - |= sh64_elf_section_data (asect)->contents_flags; + |= sh64_elf_section_data (asect)->sh64_info->contents_flags; /* If this section has the SEC_SORT_ENTRIES flag set, it is a sorted .cranges section passing through objcopy. */ @@ -300,7 +323,7 @@ sh64_bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec) if (! _bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec)) return FALSE; - sh64_sec_data = sh64_elf_section_data (isec); + sh64_sec_data = sh64_elf_section_data (isec)->sh64_info; if (sh64_sec_data == NULL) { sh64_sec_data = bfd_zmalloc (sizeof (struct sh64_section_data)); @@ -312,7 +335,7 @@ sh64_bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec) = (elf_section_data (isec)->this_hdr.sh_flags & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED)); - sh64_elf_section_data (osec) = sh64_sec_data; + sh64_elf_section_data (osec)->sh64_info = sh64_sec_data; } return TRUE; @@ -656,7 +679,7 @@ sh64_elf_final_write_processing (abfd, linker) && cranges != NULL && elf_elfheader (abfd)->e_type != ET_EXEC && (ld_generated_cranges_size - = sh64_elf_section_data (cranges)->cranges_growth) != 0) + = sh64_elf_section_data (cranges)->sh64_info->cranges_growth) != 0) { bfd_vma incoming_cranges_size = ((cranges->_cooked_size != 0 diff --git a/bfd/elf32-sh64.h b/bfd/elf32-sh64.h new file mode 100644 index 0000000000..87af05bc2c --- /dev/null +++ b/bfd/elf32-sh64.h @@ -0,0 +1,83 @@ +/* SH ELF support for BFD. + Copyright 2003 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef ELF32_SH64_H +#define ELF32_SH64_H + +#define SH64_CRANGES_SECTION_NAME ".cranges" +enum sh64_elf_cr_type { + CRT_NONE = 0, + CRT_DATA = 1, + CRT_SH5_ISA16 = 2, + CRT_SH5_ISA32 = 3 +}; + +/* The official definition is this: + + typedef struct { + Elf32_Addr cr_addr; + Elf32_Word cr_size; + Elf32_Half cr_type; + } Elf32_CRange; + + but we have no use for that exact type. Instead we use this struct for + the internal representation. */ +typedef struct { + bfd_vma cr_addr; + bfd_size_type cr_size; + enum sh64_elf_cr_type cr_type; +} sh64_elf_crange; + +#define SH64_CRANGE_SIZE (4 + 4 + 2) +#define SH64_CRANGE_CR_ADDR_OFFSET 0 +#define SH64_CRANGE_CR_SIZE_OFFSET 4 +#define SH64_CRANGE_CR_TYPE_OFFSET (4 + 4) + +/* Get the contents type of an arbitrary address, or return CRT_NONE. */ +extern enum sh64_elf_cr_type sh64_get_contents_type + PARAMS ((asection *, bfd_vma, sh64_elf_crange *)); + +/* Simpler interface. + FIXME: This seems redundant now that we export the interface above. */ +extern bfd_boolean sh64_address_is_shmedia PARAMS ((asection *, bfd_vma)); + +extern int _bfd_sh64_crange_qsort_cmpb PARAMS ((const void *, const void *)); +extern int _bfd_sh64_crange_qsort_cmpl PARAMS ((const void *, const void *)); +extern int _bfd_sh64_crange_bsearch_cmpb PARAMS ((const void *, const void *)); +extern int _bfd_sh64_crange_bsearch_cmpl PARAMS ((const void *, const void *)); + +struct sh64_section_data +{ + flagword contents_flags; + + /* Only used in the cranges section, but we don't have an official + backend-specific bfd field. */ + bfd_size_type cranges_growth; +}; + +struct _sh64_elf_section_data +{ + struct bfd_elf_section_data elf; + struct sh64_section_data *sh64_info; +}; + +#define sh64_elf_section_data(sec) \ + ((struct _sh64_elf_section_data *) elf_section_data (sec)) + +#endif /* ELF32_SH64_H */ diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c index 07137baef3..93285f8c56 100644 --- a/bfd/elf32-sparc.c +++ b/bfd/elf32-sparc.c @@ -1,6 +1,6 @@ /* SPARC-specific support for 32-bit ELF - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -37,6 +37,8 @@ static bfd_boolean elf32_sparc_adjust_dynamic_symbol PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); static bfd_boolean elf32_sparc_size_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *)); +static bfd_boolean elf32_sparc_new_section_hook + PARAMS ((bfd *, asection *)); static bfd_boolean elf32_sparc_relax_section PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *)); static bfd_boolean elf32_sparc_relocate_section @@ -1067,8 +1069,30 @@ elf32_sparc_size_dynamic_sections (output_bfd, info) return TRUE; } -#define SET_SEC_DO_RELAX(section) do { elf_section_data(section)->tdata = (void *)1; } while (0) -#define SEC_DO_RELAX(section) (elf_section_data(section)->tdata == (void *)1) +struct elf32_sparc_section_data +{ + struct bfd_elf_section_data elf; + unsigned int do_relax; +}; + +#define sec_do_relax(sec) \ + ((struct elf32_sparc_section_data *) (sec)->used_by_bfd)->do_relax + +static bfd_boolean +elf32_sparc_new_section_hook (abfd, sec) + bfd *abfd; + asection *sec; +{ + struct elf32_sparc_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); + + sdata = (struct elf32_sparc_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + + return _bfd_elf_new_section_hook (abfd, sec); +} static bfd_boolean elf32_sparc_relax_section (abfd, section, link_info, again) @@ -1078,7 +1102,7 @@ elf32_sparc_relax_section (abfd, section, link_info, again) bfd_boolean *again; { *again = FALSE; - SET_SEC_DO_RELAX (section); + sec_do_relax (section) = 1; return TRUE; } @@ -1590,7 +1614,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section, r = bfd_reloc_ok; } else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30) - && SEC_DO_RELAX (input_section) + && sec_do_relax (input_section) && rel->r_offset + 4 < input_section->_raw_size) { #define G0 0 diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 50fcfbabf1..d29f2862ea 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -1,5 +1,5 @@ /* MIPS-specific support for 64-bit ELF - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Ian Lance Taylor, Cygnus Support Linker support added by Mark Mitchell, CodeSourcery, LLC. @@ -2746,6 +2746,7 @@ const struct elf_size_info mips_elf64_size_info = MIPS-specific function only applies to IRIX5, which had no 64-bit ABI. */ #define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line +#define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents #define bfd_elf64_bfd_get_relocated_section_contents \ _bfd_elf_mips_get_relocated_section_contents diff --git a/bfd/elf64-mmix.c b/bfd/elf64-mmix.c index 3cca228ead..a7b28065f7 100644 --- a/bfd/elf64-mmix.c +++ b/bfd/elf64-mmix.c @@ -1,5 +1,5 @@ /* MMIX-specific support for 64-bit ELF. - Copyright 2001, 2002 Free Software Foundation, Inc. + Copyright 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Hans-Peter Nilsson This file is part of BFD, the Binary File Descriptor library. @@ -41,8 +41,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ _bfd_abort (__FILE__, __LINE__, \ "bad case for " #x) +struct _mmix_elf_section_data +{ + struct bfd_elf_section_data elf; + union + { + struct bpo_reloc_section_info *reloc; + struct bpo_greg_section_info *greg; + } bpo; +}; + +#define mmix_elf_section_data(sec) \ + ((struct _mmix_elf_section_data *) (sec)->used_by_bfd) + /* For each section containing a base-plus-offset (BPO) reloc, we attach - this struct as elf_section_data (section)->tdata, which is otherwise + this struct as mmix_elf_section_data (section)->bpo, which is otherwise NULL. */ struct bpo_reloc_section_info { @@ -83,7 +96,7 @@ struct bpo_reloc_request bfd_boolean valid; }; -/* We attach this as elf_section_data (sec)->tdata in the linker-allocated +/* We attach this as mmix_elf_section_data (sec)->bpo in the linker-allocated greg contents section (MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME), which is linked into the register contents section (MMIX_REG_CONTENTS_SECTION_NAME). This section is created by the @@ -135,6 +148,9 @@ static void mmix_info_to_howto_rela static int mmix_elf_sort_relocs PARAMS ((const PTR, const PTR)); +static bfd_boolean mmix_elf_new_section_hook + PARAMS ((bfd *, asection *)); + static bfd_boolean mmix_elf_check_relocs PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *)); @@ -795,6 +811,22 @@ bfd_elf64_bfd_reloc_type_lookup (abfd, code) return NULL; } +static bfd_boolean +mmix_elf_new_section_hook (abfd, sec) + bfd *abfd; + asection *sec; +{ + struct _mmix_elf_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); + + sdata = (struct _mmix_elf_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + + return _bfd_elf_new_section_hook (abfd, sec); +} + /* This function performs the actual bitfiddling and sanity check for a final relocation. Each relocation gets its *worst*-case expansion @@ -983,13 +1015,11 @@ mmix_elf_perform_relocation (isec, howto, datap, addr, value) case R_MMIX_BASE_PLUS_OFFSET: { struct bpo_reloc_section_info *bpodata - = (struct bpo_reloc_section_info *) - elf_section_data (isec)->tdata; + = mmix_elf_section_data (isec)->bpo.reloc; asection *bpo_greg_section = bpodata->bpo_greg_section; struct bpo_greg_section_info *gregdata - = (struct bpo_greg_section_info *) - elf_section_data (bpo_greg_section)->tdata; + = mmix_elf_section_data (bpo_greg_section)->bpo.greg; size_t bpo_index = gregdata->bpo_reloc_indexes[bpodata->bpo_index++]; @@ -1573,8 +1603,7 @@ mmix_elf_gc_sweep_hook (abfd, info, sec, relocs) const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; { struct bpo_reloc_section_info *bpodata - = (struct bpo_reloc_section_info *) - elf_section_data (sec)->tdata; + = mmix_elf_section_data (sec)->bpo.reloc; asection *allocated_gregs_section; /* If no bpodata here, we have nothing to do. */ @@ -1583,9 +1612,7 @@ mmix_elf_gc_sweep_hook (abfd, info, sec, relocs) allocated_gregs_section = bpodata->bpo_greg_section; - ((struct bpo_greg_section_info *) - elf_section_data (allocated_gregs_section)->tdata) - ->n_bpo_relocs + mmix_elf_section_data (allocated_gregs_section)->bpo.greg->n_bpo_relocs -= bpodata->n_bpo_relocs_this_section; return TRUE; @@ -1698,10 +1725,12 @@ mmix_elf_check_common_relocs (abfd, info, sec, relocs) bfd_zalloc (bpo_greg_owner, sizeof (struct bpo_greg_section_info)); if (gregdata == NULL) return FALSE; - elf_section_data (allocated_gregs_section)->tdata = gregdata; + mmix_elf_section_data (allocated_gregs_section)->bpo.greg + = gregdata; } else if (gregdata == NULL) - gregdata = elf_section_data (allocated_gregs_section)->tdata; + gregdata + = mmix_elf_section_data (allocated_gregs_section)->bpo.greg; /* Get ourselves some auxiliary info for the BPO-relocs. */ if (bpodata == NULL) @@ -1714,7 +1743,7 @@ mmix_elf_check_common_relocs (abfd, info, sec, relocs) * (sec->reloc_count + 1)); if (bpodata == NULL) return FALSE; - elf_section_data (sec)->tdata = bpodata; + mmix_elf_section_data (sec)->bpo.reloc = bpodata; bpodata->first_base_plus_offset_reloc = bpodata->bpo_index = gregdata->n_max_bpo_relocs; @@ -2084,8 +2113,7 @@ _bfd_mmix_prepare_linker_allocated_gregs (abfd, info) return TRUE; /* We use the target-data handle in the ELF section data. */ - gregdata = (struct bpo_greg_section_info *) - elf_section_data (bpo_gregs_section)->tdata; + gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg; if (gregdata == NULL) return FALSE; @@ -2163,8 +2191,7 @@ _bfd_mmix_finalize_linker_allocated_gregs (abfd, link_info) /* We use the target-data handle in the ELF section data. */ - gregdata = (struct bpo_greg_section_info *) - elf_section_data (bpo_gregs_section)->tdata; + gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg; if (gregdata == NULL) return FALSE; @@ -2260,8 +2287,7 @@ mmix_dump_bpo_gregs (link_info, pf) if (bpo_gregs_section == NULL) return; - gregdata = (struct bpo_greg_section_info *) - elf_section_data (bpo_gregs_section)->tdata; + gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg; if (gregdata == NULL) return; @@ -2313,8 +2339,7 @@ mmix_elf_relax_section (abfd, sec, link_info, again) asection *bpo_gregs_section = NULL; struct bpo_greg_section_info *gregdata; struct bpo_reloc_section_info *bpodata - = (struct bpo_reloc_section_info *) - elf_section_data (sec)->tdata; + = mmix_elf_section_data (sec)->bpo.reloc; size_t bpono; bfd *bpo_greg_owner; Elf_Internal_Sym *isymbuf = NULL; @@ -2343,8 +2368,7 @@ mmix_elf_relax_section (abfd, sec, link_info, again) bpo_greg_owner = (bfd *) link_info->base_file; bpo_gregs_section = bpodata->bpo_greg_section; - gregdata = (struct bpo_greg_section_info *) - elf_section_data (bpo_gregs_section)->tdata; + gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg; bpono = bpodata->first_base_plus_offset_reloc; @@ -2560,6 +2584,7 @@ mmix_elf_relax_section (abfd, sec, link_info, again) #define elf_backend_section_from_bfd_section \ mmix_elf_section_from_bfd_section +#define bfd_elf64_new_section_hook mmix_elf_new_section_hook #define bfd_elf64_bfd_final_link mmix_elf_final_link #define bfd_elf64_bfd_relax_section mmix_elf_relax_section diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index ec4032fa97..2ca139d807 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -56,6 +56,8 @@ static bfd_boolean ppc64_elf_object_p PARAMS ((bfd *)); static bfd_boolean ppc64_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *)); +static bfd_boolean ppc64_elf_new_section_hook + PARAMS ((bfd *, asection *)); /* The name of the dynamic interpreter. This is put in the .interp @@ -1675,6 +1677,35 @@ ppc64_elf_merge_private_bfd_data (ibfd, obfd) return TRUE; } + +struct _ppc64_elf_section_data +{ + struct bfd_elf_section_data elf; + union + { + asection **func_sec; + long *adjust; + } opd; +}; + +#define ppc64_elf_section_data(sec) \ + ((struct _ppc64_elf_section_data *) (sec)->used_by_bfd) + +static bfd_boolean +ppc64_elf_new_section_hook (abfd, sec) + bfd *abfd; + asection *sec; +{ + struct _ppc64_elf_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); + + sdata = (struct _ppc64_elf_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + + return _bfd_elf_new_section_hook (abfd, sec); +} /* The following functions are specific to the ELF linker, while functions above are used generally. Those named ppc64_elf_* are @@ -2564,7 +2595,7 @@ ppc64_elf_check_relocs (abfd, info, sec, relocs) opd_sym_map = (asection **) bfd_zalloc (abfd, amt); if (opd_sym_map == NULL) return FALSE; - elf_section_data (sec)->tdata = opd_sym_map; + ppc64_elf_section_data (sec)->opd.func_sec = opd_sym_map; } if (htab->elf.dynobj == NULL) @@ -2939,7 +2970,7 @@ ppc64_elf_gc_mark_hook (sec, info, rel, h, sym) sections, as all functions are referenced in .opd. */ else if ((fdh->oh != NULL && ((struct ppc_link_hash_entry *) fdh->oh)->is_entry) - || elf_section_data (sec)->tdata == NULL) + || ppc64_elf_section_data (sec)->opd.func_sec == NULL) rsec = h->root.u.def.section; break; @@ -2957,10 +2988,10 @@ ppc64_elf_gc_mark_hook (sec, info, rel, h, sym) asection **opd_sym_section; rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx); - opd_sym_section = (asection **) elf_section_data (rsec)->tdata; + opd_sym_section = ppc64_elf_section_data (rsec)->opd.func_sec; if (opd_sym_section != NULL) rsec = opd_sym_section[sym->st_value / 24]; - else if (elf_section_data (sec)->tdata != NULL) + else if (ppc64_elf_section_data (sec)->opd.func_sec != NULL) rsec = NULL; } @@ -3563,13 +3594,13 @@ ppc64_elf_edit_opd (obfd, info) continue; amt = sec->_raw_size * sizeof (long) / 24; - adjust = (long *) elf_section_data (sec)->tdata; + adjust = ppc64_elf_section_data (sec)->opd.adjust; if (adjust == NULL) { /* Must be a ld -r link. ie. check_relocs hasn't been called. */ adjust = (long *) bfd_zalloc (obfd, amt); - elf_section_data (sec)->tdata = adjust; + ppc64_elf_section_data (sec)->opd.adjust = adjust; } memset (adjust, 0, (size_t) amt); @@ -5305,7 +5336,7 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section, TOCstart = elf_gp (output_bfd); symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; sym_hashes = elf_sym_hashes (input_bfd); - is_opd = elf_section_data (input_section)->tdata != NULL; + is_opd = ppc64_elf_section_data (input_section)->opd.adjust != NULL; rel = relocs; relend = relocs + input_section->reloc_count; @@ -5361,7 +5392,7 @@ ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section, { long *opd_sym_adjust; - opd_sym_adjust = (long *) elf_section_data (sec)->tdata; + opd_sym_adjust = ppc64_elf_section_data (sec)->opd.adjust; if (opd_sym_adjust != NULL && sym->st_value % 24 == 0) relocation += opd_sym_adjust[sym->st_value / 24]; } @@ -6338,6 +6369,7 @@ ppc64_elf_finish_dynamic_sections (output_bfd, info) #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data +#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create #define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c index c3a3f05a0b..7e38d9794f 100644 --- a/bfd/elf64-sparc.c +++ b/bfd/elf64-sparc.c @@ -1,6 +1,6 @@ /* SPARC-specific support for 64-bit ELF - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -77,6 +77,8 @@ static bfd_boolean sparc64_elf_fake_sections static const char *sparc64_elf_print_symbol_all PARAMS ((bfd *, PTR, asymbol *)); +static bfd_boolean sparc64_elf_new_section_hook + PARAMS ((bfd *, asection *)); static bfd_boolean sparc64_elf_relax_section PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *)); static bfd_boolean sparc64_elf_relocate_section @@ -1868,8 +1870,30 @@ sparc64_elf_size_dynamic_sections (output_bfd, info) return TRUE; } -#define SET_SEC_DO_RELAX(section) do { elf_section_data(section)->tdata = (void *)1; } while (0) -#define SEC_DO_RELAX(section) (elf_section_data(section)->tdata == (void *)1) +struct sparc64_elf_section_data +{ + struct bfd_elf_section_data elf; + unsigned int do_relax; +}; + +#define sec_do_relax(sec) \ + ((struct sparc64_elf_section_data *) (sec)->used_by_bfd)->do_relax + +static bfd_boolean +sparc64_elf_new_section_hook (abfd, sec) + bfd *abfd; + asection *sec; +{ + struct sparc64_elf_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); + + sdata = (struct sparc64_elf_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + + return _bfd_elf_new_section_hook (abfd, sec); +} static bfd_boolean sparc64_elf_relax_section (abfd, section, link_info, again) @@ -1879,7 +1903,7 @@ sparc64_elf_relax_section (abfd, section, link_info, again) bfd_boolean *again; { *again = FALSE; - SET_SEC_DO_RELAX (section); + sec_do_relax (section) = 1; return TRUE; } @@ -2456,7 +2480,7 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section, case R_SPARC_WDISP30: do_wplt30: - if (SEC_DO_RELAX (input_section) + if (sec_do_relax (input_section) && rel->r_offset + 4 < input_section->_raw_size) { #define G0 0 @@ -3116,6 +3140,8 @@ const struct elf_size_info sparc64_elf_size_info = sparc64_elf_reloc_type_lookup #define bfd_elf64_bfd_relax_section \ sparc64_elf_relax_section +#define bfd_elf64_new_section_hook \ + sparc64_elf_new_section_hook #define elf_backend_create_dynamic_sections \ _bfd_elf_create_dynamic_sections diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 269c98c8d3..00a0e88c1c 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2199,6 +2199,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define elf_backend_mips_irix_compat elf_n32_mips_irix_compat #define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto #define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line +#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents #define bfd_elf32_bfd_get_relocated_section_contents \ _bfd_elf_mips_get_relocated_section_contents diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 3164a2ec17..a2fcd038bc 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -61,8 +61,7 @@ struct mips_got_entry unsigned long gotidx; }; -/* This structure is used to hold .got information when linking. It - is stored in the tdata field of the bfd_elf_section_data structure. */ +/* This structure is used to hold .got information when linking. */ struct mips_got_info { @@ -79,6 +78,19 @@ struct mips_got_info struct htab *got_entries; }; +struct _mips_elf_section_data +{ + struct bfd_elf_section_data elf; + union + { + struct mips_got_info *got_info; + bfd_byte *tdata; + } u; +}; + +#define mips_elf_section_data(sec) \ + ((struct _mips_elf_section_data *) (sec)->used_by_bfd) + /* This structure is passed to mips_elf_sort_hash_table_f when sorting the dynamic symbols. */ @@ -638,6 +650,22 @@ mips_elf_link_hash_newfunc (entry, table, string) return (struct bfd_hash_entry *) ret; } + +bfd_boolean +_bfd_mips_elf_new_section_hook (abfd, sec) + bfd *abfd; + asection *sec; +{ + struct _mips_elf_section_data *sdata; + bfd_size_type amt = sizeof (*sdata); + + sdata = (struct _mips_elf_section_data *) bfd_zalloc (abfd, amt); + if (sdata == NULL) + return FALSE; + sec->used_by_bfd = (PTR) sdata; + + return _bfd_elf_new_section_hook (abfd, sec); +} /* Read ECOFF debugging information from a .mdebug section into a ecoff_debug_info structure. */ @@ -1467,8 +1495,8 @@ mips_elf_got_info (abfd, sgotp) sgot = mips_elf_got_section (abfd); BFD_ASSERT (sgot != NULL); - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; + BFD_ASSERT (mips_elf_section_data (sgot) != NULL); + g = mips_elf_section_data (sgot)->u.got_info; BFD_ASSERT (g != NULL); if (sgotp) @@ -1997,15 +2025,8 @@ mips_elf_create_got_section (abfd, info) (htab_del) NULL); if (g->got_entries == NULL) return FALSE; - if (elf_section_data (s) == NULL) - { - amt = sizeof (struct bfd_elf_section_data); - s->used_by_bfd = (PTR) bfd_zalloc (abfd, amt); - if (elf_section_data (s) == NULL) - return FALSE; - } - elf_section_data (s)->tdata = (PTR) g; - elf_section_data (s)->this_hdr.sh_flags + mips_elf_section_data (s)->u.got_info = g; + mips_elf_section_data (s)->elf.this_hdr.sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL; return TRUE; @@ -3310,19 +3331,19 @@ _bfd_mips_elf_section_processing (abfd, hdr) if (hdr->sh_type == SHT_MIPS_OPTIONS && hdr->bfd_section != NULL - && elf_section_data (hdr->bfd_section) != NULL - && elf_section_data (hdr->bfd_section)->tdata != NULL) + && mips_elf_section_data (hdr->bfd_section) != NULL + && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL) { bfd_byte *contents, *l, *lend; - /* We stored the section contents in the elf_section_data tdata - field in the set_section_contents routine. We save the - section contents so that we don't have to read them again. + /* We stored the section contents in the tdata field in the + set_section_contents routine. We save the section contents + so that we don't have to read them again. At this point we know that elf_gp is set, so we can look through the section contents to see if there is an ODK_REGINFO structure. */ - contents = (bfd_byte *) elf_section_data (hdr->bfd_section)->tdata; + contents = mips_elf_section_data (hdr->bfd_section)->u.tdata; l = contents; lend = contents + hdr->sh_size; while (l + sizeof (Elf_External_Options) <= lend) @@ -4289,8 +4310,8 @@ _bfd_mips_elf_check_relocs (abfd, info, sec, relocs) g = NULL; else { - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; + BFD_ASSERT (mips_elf_section_data (sgot) != NULL); + g = mips_elf_section_data (sgot)->u.got_info; BFD_ASSERT (g != NULL); } } @@ -4803,8 +4824,8 @@ _bfd_mips_elf_size_dynamic_sections (output_bfd, info) bfd_size_type local_gotno; bfd *sub; - BFD_ASSERT (elf_section_data (s) != NULL); - g = (struct mips_got_info *) elf_section_data (s)->tdata; + BFD_ASSERT (mips_elf_section_data (s) != NULL); + g = mips_elf_section_data (s)->u.got_info; BFD_ASSERT (g != NULL); /* Calculate the total loadable size of the output. That @@ -5527,7 +5548,7 @@ _bfd_mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym) sgot = mips_elf_got_section (dynobj); BFD_ASSERT (sgot != NULL); BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; + g = mips_elf_section_data (sgot)->u.got_info; BFD_ASSERT (g != NULL); /* Run through the global symbol table, creating GOT entries for all @@ -5675,7 +5696,7 @@ _bfd_mips_elf_finish_dynamic_sections (output_bfd, info) else { BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; + g = mips_elf_section_data (sgot)->u.got_info; BFD_ASSERT (g != NULL); } @@ -6504,7 +6525,7 @@ _bfd_mips_elf_hide_symbol (info, entry, force_local) dynobj = elf_hash_table (info)->dynobj; got = bfd_get_section_by_name (dynobj, ".got"); - g = (struct mips_got_info *) elf_section_data (got)->tdata; + g = mips_elf_section_data (got)->u.got_info; _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local); @@ -6565,7 +6586,7 @@ _bfd_mips_elf_discard_info (abfd, cookie, info) if (skip != 0) { - elf_section_data (o)->tdata = tdata; + mips_elf_section_data (o)->u.tdata = tdata; o->_cooked_size = o->_raw_size - skip * PDR_SIZE; ret = TRUE; } @@ -6599,7 +6620,7 @@ _bfd_mips_elf_write_section (output_bfd, sec, contents) if (strcmp (sec->name, ".pdr") != 0) return FALSE; - if (elf_section_data (sec)->tdata == NULL) + if (mips_elf_section_data (sec)->u.tdata == NULL) return FALSE; to = contents; @@ -6608,7 +6629,7 @@ _bfd_mips_elf_write_section (output_bfd, sec, contents) from < end; from += PDR_SIZE, i++) { - if (((unsigned char *) elf_section_data (sec)->tdata)[i] == 1) + if ((mips_elf_section_data (sec)->u.tdata)[i] == 1) continue; if (to != from) memcpy (to, from, PDR_SIZE); @@ -6758,7 +6779,7 @@ _bfd_mips_elf_set_section_contents (abfd, section, location, offset, count) if (elf_section_data (section) == NULL) return FALSE; } - c = (bfd_byte *) elf_section_data (section)->tdata; + c = mips_elf_section_data (section)->u.tdata; if (c == NULL) { bfd_size_type size; @@ -6770,7 +6791,7 @@ _bfd_mips_elf_set_section_contents (abfd, section, location, offset, count) c = (bfd_byte *) bfd_zalloc (abfd, size); if (c == NULL) return FALSE; - elf_section_data (section)->tdata = (PTR) c; + mips_elf_section_data (section)->u.tdata = c; } memcpy (c + offset, location, (size_t) count); @@ -7070,7 +7091,7 @@ _bfd_mips_elf_final_link (abfd, info) /* Make sure we didn't grow the global .got region. */ dynobj = elf_hash_table (info)->dynobj; got = bfd_get_section_by_name (dynobj, ".got"); - g = (struct mips_got_info *) elf_section_data (got)->tdata; + g = mips_elf_section_data (got)->u.got_info; if (g->global_gotsym != NULL) BFD_ASSERT ((elf_hash_table (info)->dynsymcount diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h index 9b935c6f64..3f7794361b 100644 --- a/bfd/elfxx-mips.h +++ b/bfd/elfxx-mips.h @@ -1,5 +1,5 @@ /* MIPS ELF specific backend routines. - Copyright 2002 Free Software Foundation, Inc. + Copyright 2002, 2003 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -20,6 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "elf/common.h" #include "elf/internal.h" +extern bfd_boolean _bfd_mips_elf_new_section_hook + PARAMS ((bfd *, asection *)); extern void _bfd_mips_elf_symbol_processing PARAMS ((bfd *, asymbol *)); extern bfd_boolean _bfd_mips_elf_section_processing diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index c3ff1047c2..69e3782b1b 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -1,6 +1,6 @@ /* Target definitions for NN-bit ELF - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -53,7 +53,9 @@ #define bfd_elfNN_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol #endif #define bfd_elfNN_make_empty_symbol _bfd_elf_make_empty_symbol +#ifndef bfd_elfNN_new_section_hook #define bfd_elfNN_new_section_hook _bfd_elf_new_section_hook +#endif #define bfd_elfNN_set_arch_mach _bfd_elf_set_arch_mach #ifndef bfd_elfNN_set_section_contents #define bfd_elfNN_set_section_contents _bfd_elf_set_section_contents -- cgit v1.2.1