This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[rfa:] CRIS port part 3/8: bfd


Here are the bfd bits.

Ok to commit?

2000-07-18  Hans-Peter Nilsson  <hp@axis.com>

	* Makefile.am (ALL_MACHINES): Add cpu-cris.lo.
	(ALL_MACHINES_CFILES): Add cpu-cris.c.
	(BFD32_BACKENDS): Add aout-cris.lo and elf32-cris.lo.
	(BFD32_BACKENDS_CFILES): Add aout-cris.c and elf32-cris.c.
	(cpu-cris.lo, aout-cris.lo, elf32-cris.lo): New rules.
	* Makefile.in: Rebuild.
	* aoutx.h (NAME(aout,machine_type)): Add case for bfd_arch_cris.
	* archures.c (enum bfd_architecture): Add bfd_arch_cris.
	(bfd_cris_arch): Declare.
	(bfd_archures_list): Add bfd_cris_arch.
	* bfd-in2.h: Rebuild.
	* config.bfd: (cris-*-*): New target.
	* configure.in (bfd_elf32_cris_vec, cris_aout_vec): New vectors.
	* configure: Rebuild.
	* elf.c (prep_headers): Add bfd_arch_cris.
	* libbfd.h: Rebuild.
	* libaout.h (enum machine_type): Add M_CRIS.
	* reloc.c: Add CRIS relocations.
	* targets.c (bfd_target bfd_elf32_cris_vec, cris_aout_vec):
	Declare.
	(bfd_target_vect): Add bfd_elf32_cris_vec and cris_aout_vec.
	* cpu-cris.c, aout-cris.c, elf32-cris.c: New files.
	* po/POTFILES.in, bfd.pot: Regenerate.

Index: bfd/Makefile.am
===================================================================
RCS file: /cvs/src/src/bfd/Makefile.am,v
retrieving revision 1.37
diff -p -c -r1.37 Makefile.am
*** Makefile.am	2000/07/09 07:23:07	1.37
--- Makefile.am	2000/07/18 15:20:20
*************** ALL_MACHINES = \
*** 45,50 ****
--- 45,51 ----
  	cpu-arc.lo \
  	cpu-arm.lo \
  	cpu-avr.lo \
+ 	cpu-cris.lo \
  	cpu-d10v.lo \
  	cpu-d30v.lo \
  	cpu-fr30.lo \
*************** ALL_MACHINES_CFILES = \
*** 86,91 ****
--- 87,93 ----
  	cpu-arc.c \
  	cpu-arm.c \
  	cpu-avr.c \
+ 	cpu-cris.c \
  	cpu-d10v.c \
  	cpu-d30v.c \
  	cpu-fr30.c \
*************** ALL_MACHINES_CFILES = \
*** 126,131 ****
--- 128,134 ----
  BFD32_BACKENDS = \
  	aout-adobe.lo \
  	aout-arm.lo \
+ 	aout-cris.lo \
  	aout-ns32k.lo \
  	aout-sparcle.lo \
  	aout-tic30.lo \
*************** BFD32_BACKENDS = \
*** 173,178 ****
--- 176,182 ----
  	elfarm-oabi.lo \
  	elfarm-nabi.lo \
  	elf32-avr.lo \
+ 	elf32-cris.lo \
  	elf32-d10v.lo \
  	elf32-d30v.lo \
  	elf32-fr30.lo \
*************** BFD32_BACKENDS = \
*** 261,266 ****
--- 265,271 ----
  BFD32_BACKENDS_CFILES = \
  	aout-adobe.c \
  	aout-arm.c \
+ 	aout-cris.c \
  	aout-ns32k.c \
  	aout-sparcle.c \
  	aout-tic30.c \
*************** BFD32_BACKENDS_CFILES = \
*** 308,313 ****
--- 313,319 ----
  	elfarm-oabi.c \
  	elfarm-nabi.c \
  	elf32-avr.c \
+ 	elf32-cris.c \
  	elf32-d10v.c \
  	elf32-d30v.c \
  	elf32-fr30.c \
*************** cpu-alpha.lo: cpu-alpha.c $(INCDIR)/file
*** 720,725 ****
--- 726,732 ----
  cpu-arc.lo: cpu-arc.c $(INCDIR)/filenames.h
  cpu-arm.lo: cpu-arm.c $(INCDIR)/filenames.h
  cpu-avr.lo: cpu-avr.c $(INCDIR)/filenames.h
+ cpu-cris.lo: cpu-cris.c $(INCDIR)/filenames.h
  cpu-d10v.lo: cpu-d10v.c $(INCDIR)/filenames.h
  cpu-d30v.lo: cpu-d30v.c $(INCDIR)/filenames.h
  cpu-fr30.lo: cpu-fr30.c $(INCDIR)/filenames.h
*************** aout-arm.lo: aout-arm.c $(INCDIR)/filena
*** 762,767 ****
--- 769,778 ----
    $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h aoutx.h \
    $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h \
    aout-target.h
+ aout-cris.lo: aout-cris.c aout32.c aoutx.h $(INCDIR)/filenames.h \
+   $(INCDIR)/bfdlink.h libaout.h $(INCDIR)/aout/aout64.h \
+   $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h \
+   aout-target.h
  aout-ns32k.lo: aout-ns32k.c $(INCDIR)/aout/aout64.h \
    ns32k.h libaout.h $(INCDIR)/bfdlink.h
  aout-sparcle.lo: aout-sparcle.c $(INCDIR)/bfdlink.h \
*************** elfarm-nabi.lo: elfarm-nabi.c $(INCDIR)/
*** 912,917 ****
--- 923,932 ----
  elf32-avr.lo: elf32-avr.c $(INCDIR)/filenames.h elf-bfd.h \
    $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
    $(INCDIR)/bfdlink.h $(INCDIR)/elf/avr.h $(INCDIR)/elf/reloc-macros.h \
+   elf32-target.h
+ elf32-cris.lo: elf32-cris.c $(INCDIR)/filenames.h elf-bfd.h \
+   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+   $(INCDIR)/bfdlink.h $(INCDIR)/elf/cris.h $(INCDIR)/elf/reloc-macros.h \
    elf32-target.h
  elf32-d10v.lo: elf32-d10v.c $(INCDIR)/filenames.h elf-bfd.h \
    $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
Index: bfd/aoutx.h
===================================================================
RCS file: /cvs/src/src/bfd/aoutx.h,v
retrieving revision 1.7
diff -p -c -r1.7 aoutx.h
*** aoutx.h	2000/07/15 18:42:00	1.7
--- aoutx.h	2000/07/18 15:20:47
*************** NAME(aout,machine_type) (arch, machine, 
*** 800,805 ****
--- 800,809 ----
      *unknown = false;
      break;
  
+   case bfd_arch_cris:
+     if (machine == 0 || machine == 255)	arch_flags = M_CRIS;
+     break;
+ 
    default:
      arch_flags = M_UNKNOWN;
    }
Index: bfd/archures.c
===================================================================
RCS file: /cvs/src/src/bfd/archures.c,v
retrieving revision 1.18
diff -p -c -r1.18 archures.c
*** archures.c	2000/07/10 18:29:38	1.18
--- archures.c	2000/07/18 15:20:50
*************** DESCRIPTION
*** 230,235 ****
--- 230,236 ----
  .#define bfd_mach_avr3		3
  .#define bfd_mach_avr4		4
  .#define bfd_mach_avr5		5
+ .  bfd_arch_cris,      {* Axis CRIS *}
  .  bfd_arch_last
  .  };
  
*************** extern const bfd_arch_info_type bfd_a29k
*** 272,277 ****
--- 273,279 ----
  extern const bfd_arch_info_type bfd_alpha_arch;
  extern const bfd_arch_info_type bfd_arc_arch;
  extern const bfd_arch_info_type bfd_arm_arch;
+ extern const bfd_arch_info_type bfd_cris_arch;
  extern const bfd_arch_info_type bfd_d10v_arch;
  extern const bfd_arch_info_type bfd_d30v_arch;
  extern const bfd_arch_info_type bfd_h8300_arch;
*************** static const bfd_arch_info_type * const 
*** 317,322 ****
--- 319,325 ----
    &bfd_alpha_arch,
    &bfd_arc_arch,
    &bfd_arm_arch,
+   &bfd_cris_arch,
    &bfd_d10v_arch,
    &bfd_d30v_arch,
    &bfd_h8300_arch,
Index: bfd/config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.36
diff -p -c -r1.36 config.bfd
*** config.bfd	2000/07/09 07:23:07	1.36
--- config.bfd	2000/07/18 15:21:05
*************** case "${targ}" in
*** 207,212 ****
--- 207,218 ----
      targ_underscore=yes
      ;;
  
+   cris-*-*)
+     targ_defvec=cris_aout_vec
+     targ_selvecs="bfd_elf32_cris_vec ieee_vec"
+     targ_underscore=yes
+     ;;
+ 
    d10v-*-*)
      targ_defvec=bfd_elf32_d10v_vec
      ;;
Index: bfd/configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.27
diff -p -c -r1.27 configure.in
*** configure.in	2000/07/02 01:17:52	1.27
--- configure.in	2000/07/18 15:21:29
*************** do
*** 488,493 ****
--- 488,494 ----
      bfd_elf32_bigmips_vec) 	tb="$tb elf32-mips.lo elf32.lo $elf ecofflink.lo" ;;
      bfd_elf64_bigmips_vec) 	tb="$tb elf64-mips.lo elf64.lo elf32-mips.lo elf32.lo $elf ecofflink.lo"
  				target64=true ;;
+     bfd_elf32_cris_vec)		tb="$tb elf32-cris.lo elf32.lo $elf" ;;
      bfd_elf32_d10v_vec)		tb="$tb elf32-d10v.lo elf32.lo $elf" ;;
      bfd_elf32_d30v_vec)		tb="$tb elf32-d30v.lo elf32.lo $elf" ;;
      bfd_elf32_fr30_vec)		tb="$tb elf32-fr30.lo elf32.lo $elf" ;;
*************** do
*** 527,532 ****
--- 528,534 ----
  				target64=true ;;
      cisco_core_big_vec)		tb="$tb cisco-core.lo" ;;
      cisco_core_little_vec)	tb="$tb cisco-core.lo" ;;
+     cris_aout_vec)		tb="$tb aout-cris.lo" ;;
      demo_64_vec)		tb="$tb demo64.lo aout64.lo"
  				target64=true ;;
      ecoff_big_vec)		tb="$tb coff-mips.lo ecoff.lo ecofflink.lo" ;;
Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.38
diff -p -c -r1.38 elf.c
*** elf.c	2000/07/11 07:28:25	1.38
--- elf.c	2000/07/18 15:21:44
*************** prep_headers (abfd)
*** 3354,3359 ****
--- 3354,3362 ----
      case bfd_arch_pj:
        i_ehdrp->e_machine = EM_PJ;
        break;
+     case bfd_arch_cris:
+       i_ehdrp->e_machine = EM_CRIS;
+       break;
        /* also note that EM_M32, AT&T WE32100 is unknown to bfd */
      default:
        i_ehdrp->e_machine = EM_NONE;
Index: bfd/libaout.h
===================================================================
RCS file: /cvs/src/src/bfd/libaout.h,v
retrieving revision 1.1.1.1
diff -p -c -r1.1.1.1 libaout.h
*** libaout.h	1999/05/03 07:28:57	1.1.1.1
--- libaout.h	2000/07/18 15:22:11
*************** enum machine_type {
*** 245,251 ****
    M_SPARCLET_5 = 211,	/* 0xd3, reserved */
    M_SPARCLET_6 = 227,	/* 0xe3, reserved */
    /*  M_SPARCLET_7 = 243	/ * 0xf3, reserved */
!   M_SPARCLITE_LE = 243
  };
  
  #define N_DYNAMIC(exec) ((exec).a_info & 0x80000000)
--- 245,252 ----
    M_SPARCLET_5 = 211,	/* 0xd3, reserved */
    M_SPARCLET_6 = 227,	/* 0xe3, reserved */
    /*  M_SPARCLET_7 = 243	/ * 0xf3, reserved */
!   M_SPARCLITE_LE = 243,
!   M_CRIS = 255		/* Axis CRIS binary.  */
  };
  
  #define N_DYNAMIC(exec) ((exec).a_info & 0x80000000)
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.26
diff -p -c -r1.26 reloc.c
*** reloc.c	2000/06/19 01:22:37	1.26
--- reloc.c	2000/07/18 15:22:34
*************** ENUMDOC
*** 2898,2903 ****
--- 2898,2917 ----
    Motorola 68HC11 reloc.
    This is the 3 bits of a value.
  
+ ENUM
+   BFD_RELOC_CRIS_BDISP8
+ ENUMX
+   BFD_RELOC_CRIS_UNSIGNED_5
+ ENUMX
+   BFD_RELOC_CRIS_SIGNED_6
+ ENUMX
+   BFD_RELOC_CRIS_UNSIGNED_6
+ ENUMX
+   BFD_RELOC_CRIS_UNSIGNED_4
+ ENUMDOC
+   These relocs are only used within the CRIS assembler.  They are not
+   (at present) written to any object files.
+ 
  ENDSENUM
    BFD_RELOC_UNUSED
  CODE_FRAGMENT
Index: bfd/targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.24
diff -p -c -r1.24 targets.c
*** targets.c	2000/07/02 01:17:52	1.24
--- targets.c	2000/07/18 15:22:38
*************** extern const bfd_target bfd_elf32_little
*** 522,527 ****
--- 522,528 ----
  extern const bfd_target bfd_elf32_big_generic_vec;
  extern const bfd_target bfd_elf32_bigmips_vec;
  extern const bfd_target bfd_elf64_bigmips_vec;
+ extern const bfd_target bfd_elf32_cris_vec;
  extern const bfd_target bfd_elf32_d10v_vec;
  extern const bfd_target bfd_elf32_d30v_vec;
  extern const bfd_target bfd_elf32_hppa_vec;
*************** extern const bfd_target bfd_elf32_mcore_
*** 555,560 ****
--- 556,562 ----
  extern const bfd_target bfd_elf64_big_generic_vec;
  extern const bfd_target bfd_elf64_little_generic_vec;
  extern const bfd_target bfd_elf64_sparc_vec;
+ extern const bfd_target cris_aout_vec;
  extern const bfd_target demo_64_vec;
  extern const bfd_target ecoff_big_vec;
  extern const bfd_target ecoff_little_vec;
*************** const bfd_target * const bfd_target_vect
*** 724,729 ****
--- 726,732 ----
  #ifdef BFD64
  	&bfd_elf64_bigmips_vec,
  #endif
+ 	&bfd_elf32_cris_vec,
  	&bfd_elf32_d10v_vec,
  	&bfd_elf32_d30v_vec,
  	&bfd_elf32_hppa_vec,
*************** const bfd_target * const bfd_target_vect
*** 767,772 ****
--- 770,777 ----
  	/* We don't include cisco_core_*_vec.  Although it has a magic number,
  	   the magic number isn't at the beginning of the file, and thus
  	   might spuriously match other kinds of files.  */
+ 
+         &cris_aout_vec,
  #ifdef BFD64
  	&demo_64_vec,	/* Only compiled if host has long-long support */
  #endif
*** /dev/null	Tue Jan  1 05:00:00 1980
--- cpu-cris.c	Tue Jul 18 18:55:36 2000
***************
*** 0 ****
--- 1,57 ----
+ /* BFD support for the Axis CRIS architecture.
+    Copyright (C) 2000 Free Software Foundation, Inc.
+    Contributed by Axis Communications AB.
+    Written by Hans-Peter Nilsson.
+ 
+ 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.  */
+ 
+ #include "bfd.h"
+ #include "sysdep.h"
+ #include "libbfd.h"
+ 
+ const bfd_arch_info_type
+ bfd_cris_arch =
+ {
+   32,				/* There's 32 bits_per_word.  */
+   32,				/* There's 32 bits_per_address.  */
+   8,				/* There's 8 bits_per_byte.  */
+   bfd_arch_cris,		/* One of enum bfd_architecture, defined
+ 				   in archures.c and provided in
+ 				   generated header files.  */
+   0xff,				/* Only 1 machine, but #255 for
+ 				   historical reasons.  */
+   "cris",			/* The arch_name.  */
+   "cris",			/* The printable name is the same.  */
+   1,				/* Section alignment power; each section
+ 				   is aligned to (only) 2^1 bytes.  */
+   true,				/* This is the default "machine", since
+ 				   there's only one.  */
+   bfd_default_compatible,	/* A default function for testing
+ 				   "machine" compatibility of two
+ 				   bfd_arch_info_type.  */
+   bfd_default_scan,		/* Check if an bfd_arch_info_type is a
+ 				   match.  */
+   NULL				/* Pointer to next bfd_arch_info_type in
+ 				   the same family.  */
+ };
+ 
+ /*
+  * Local variables:
+  * eval: (c-set-style "gnu")
+  * indent-tabs-mode: t
+  * End:
+  */
*** /dev/null	Tue Jan  1 05:00:00 1980
--- aout-cris.c	Tue Jul 18 18:58:35 2000
***************
*** 0 ****
--- 1,298 ----
+ /* BFD backend for CRIS a.out binaries.
+    Copyright (C) 2000 Free Software Foundation, Inc.
+    Contributed by Axis Communications AB.
+    Written by Hans-Peter Nilsson.
+ 
+ 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.  */
+ 
+ /* See info in the file PORTING for documentation of these macros and
+    functions.  Beware; some of the information there is outdated.  */
+ 
+ #define N_HEADER_IN_TEXT(x) 0
+ #define BYTES_IN_WORD 4
+ #define N_TXTOFF(x) 32
+ #define ENTRY_CAN_BE_ZERO
+ #define TEXT_START_ADDR 0
+ 
+ /* If you change this to 4, you can not link to an address N*4+2.  */
+ #define SEGMENT_SIZE 2
+ 
+ /* For some reason, if the a.out file has Z_MAGIC, then
+    adata(abfd).exec_bytes_size is not used, but rather
+    adata(abfd).zmagic_disk_block_size, even though the exec_header is
+    *not* included in the text segment.  A simple workaround is to
+    #define ZMAGIC_DISK_BLOCK_SIZE, which is used if defined; otherwise
+    TARGET_PAGE_SIZE is used. */
+ #define ZMAGIC_DISK_BLOCK_SIZE N_TXTOFF (0)
+ 
+ /* It seems odd at first to set a page-size this low, but gives greater
+    freedom in where things can be linked.  The drawback is that you have
+    to set alignment and padding in linker scripts.  */
+ #define TARGET_PAGE_SIZE SEGMENT_SIZE
+ #define TARGETNAME "a.out-cris"
+ 
+ /* N_SHARED_LIB gets this reasonable default as of 1999-07-12, but we
+    have to work with 2.9.1.  Note that N_SHARED_LIB is used in a
+    SUN-specific context, not applicable to CRIS.  */
+ #define N_SHARED_LIB(x) 0
+ 
+ /* The definition here seems not used; just provided as a convention.  */
+ #define DEFAULT_ARCH bfd_arch_cris
+ 
+ /* ??? Spacing might be essential for the parameters in this macro.
+    Do Not Change.  */
+ #define MY(OP) CAT (cris_aout_,OP)
+ #define NAME(x,y) CAT3(cris_aout,_32_,y)
+ 
+ #include "bfd.h"
+ 
+ /* Version 1 of the header.  */
+ #define MY_exec_hdr_flags 1
+ 
+ #define MY_write_object_contents MY(write_object_contents)
+ static boolean MY(write_object_contents) PARAMS ((bfd *));
+ 
+ /* Forward this, so we can use a pointer to it in PARAMS.  */
+ struct reloc_ext_external;
+ 
+ #define MY_swap_ext_reloc_out MY(swap_ext_reloc_out)
+ static void MY(swap_ext_reloc_out) PARAMS ((bfd *, arelent *,
+ 					    struct reloc_ext_external *));
+ 
+ #define MY_swap_ext_reloc_in MY(swap_ext_reloc_in)
+ static void MY(swap_ext_reloc_in) PARAMS ((bfd *, struct
+ 					   reloc_ext_external *,
+ 					   arelent *, asymbol **,
+ 					   bfd_size_type));
+ 
+ #define MY_set_sizes MY(set_sizes)
+ static boolean MY(set_sizes) PARAMS ((bfd *));
+ 
+ /* To set back reloc_size to ext, we make MY(set_sizes) be called
+    through this construct.  Note that MY_set_arch_mach is only called
+    through SET_ARCH_MACH.  The default bfd_default_set_arch_mach will
+    not call set_sizes.  */
+ 
+ #define MY_set_arch_mach NAME (aout, set_arch_mach)
+ #define SET_ARCH_MACH(BFD, EXEC) \
+  MY_set_arch_mach (BFD, DEFAULT_ARCH, N_MACHTYPE (EXEC))
+ 
+ /* These macros describe the binary layout of the reloc information we
+    use in a file.  */
+ #define RELOC_EXT_BITS_EXTERN_LITTLE 0x80
+ #define RELOC_EXT_BITS_TYPE_LITTLE 3
+ #define RELOC_EXT_BITS_TYPE_SH_LITTLE 0
+ 
+ #ifndef MY_get_section_contents
+ #define MY_get_section_contents aout_32_get_section_contents
+ #endif
+ 
+ /* Include generic functions (some are overridden above).  */
+ #include "aout32.c"
+ #include "aout-target.h"
+ 
+ 
+ /* We need our own version to set header flags.  */
+ 
+ static boolean
+ MY(write_object_contents) (abfd)
+      bfd *abfd;
+ {
+   struct external_exec exec_bytes;
+   struct internal_exec *execp = exec_hdr (abfd);
+ 
+   /* We set the reloc type to RELOC_EXT_SIZE, although setting it at all
+      seems unnecessary when inspecting as and ld behavior (not an
+      exhaustive inspection).  The default write_object_contents
+      definition sets RELOC_EXT_SIZE, so we follow suite and set it too.  */
+   obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
+ 
+   /* Setting N_SET_MACHTYPE and using N_SET_FLAGS is not performed by
+      the default definition.  */
+   if (bfd_get_arch(abfd) == bfd_arch_cris)
+     N_SET_MACHTYPE(*execp, M_CRIS);
+ 
+   N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags);
+ 
+   WRITE_HEADERS (abfd, execp);
+ 
+   return true;
+ }
+ 
+ 
+ /* We need our own for these reasons:
+    - Assert that a normal 8, 16 or 32 reloc is output. 
+    - Fix what seems to be a weak-bug (perhaps there for valid reasons).  */ 
+ 
+ static void
+ MY(swap_ext_reloc_out) (abfd, g, natptr)
+      bfd *abfd;
+      arelent *g;
+      struct reloc_ext_external *natptr;
+ {
+   int r_index;
+   int r_extern;
+   unsigned int r_type;
+   unsigned int r_addend;
+   asymbol *sym = *(g->sym_ptr_ptr);
+   asection *output_section = sym->section->output_section;
+ 
+   PUT_WORD (abfd, g->address, natptr->r_address);
+ 
+   r_type = (unsigned int) g->howto->type;
+ 
+   r_addend = g->addend;
+   if ((sym->flags & BSF_SECTION_SYM) != 0)
+     r_addend += (*(g->sym_ptr_ptr))->section->output_section->vma;
+ 
+   /* If this relocation is relative to a symbol then set the
+      r_index to the symbols index, and the r_extern bit.
+ 
+      Absolute symbols can come in in two ways, either as an offset
+      from the abs section, or as a symbol which has an abs value.
+      check for that here.  */
+ 
+   if (bfd_is_abs_section (bfd_get_section (sym)))
+     {
+       r_extern = 0;
+       r_index = N_ABS;
+     }
+   else if ((sym->flags & BSF_SECTION_SYM) == 0)
+     {
+       if (bfd_is_und_section (bfd_get_section (sym))
+ 	  /* Remember to check for weak symbols; they count as global.  */
+ 	  || (sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
+ 	r_extern = 1;
+       else
+ 	r_extern = 0;
+       r_index = (*(g->sym_ptr_ptr))->KEEPIT;
+     }
+   else
+     {
+       /* Just an ordinary section.  */
+       r_extern = 0;
+       r_index = output_section->target_index;
+     }
+ 
+   /* The relocation type is the same as the canonical ones, but only
+      the first 3 are used: RELOC_8, RELOC_16, RELOC_32.
+      We may change this later, but assert this for the moment.  */
+   if (r_type > 2)
+     {
+       (*_bfd_error_handler) (_("%s: Invalid relocation type exported: %d"),
+ 			     bfd_get_filename (abfd), r_type);
+     
+       bfd_set_error (bfd_error_wrong_format);
+     }
+ 
+   /* Now the fun stuff.  */
+   natptr->r_index[2] = r_index >> 16;
+   natptr->r_index[1] = r_index >> 8;
+   natptr->r_index[0] = r_index;
+   natptr->r_type[0] =
+      (r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0)
+       | (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
+ 
+   PUT_WORD (abfd, r_addend, natptr->r_addend);
+ }
+ 
+ 
+ /* We need our own to assert that a normal 8, 16 or 32 reloc is input.  */
+ 
+ static void
+ MY(swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount)
+      bfd *abfd;
+      struct reloc_ext_external *bytes;
+      arelent *cache_ptr;
+      asymbol **symbols;
+      bfd_size_type symcount;
+ {
+   unsigned int r_index;
+   int r_extern;
+   unsigned int r_type;
+   struct aoutdata *su = &(abfd->tdata.aout_data->a);
+ 
+   cache_ptr->address = (GET_SWORD (abfd, bytes->r_address));
+ 
+   /* Now the fun stuff.  */
+   r_index =  (bytes->r_index[2] << 16)
+     | (bytes->r_index[1] << 8)
+     |  bytes->r_index[0];
+   r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
+   r_type = ((bytes->r_type[0]) >> RELOC_EXT_BITS_TYPE_SH_LITTLE)
+     & RELOC_EXT_BITS_TYPE_LITTLE;
+ 
+   if (r_type > 2)
+     {
+       (*_bfd_error_handler) (_("%s: Invalid relocation type imported: %d"),
+ 			     bfd_get_filename (abfd), r_type);
+     
+       bfd_set_error(bfd_error_wrong_format);
+     }
+     
+   cache_ptr->howto =  howto_table_ext + r_type;
+ 
+   if (r_extern && r_index > symcount)
+     {
+       (*_bfd_error_handler)
+         (_("%s: Bad relocation record imported: %d"),
+          bfd_get_filename (abfd), r_index);
+     
+       bfd_set_error (bfd_error_wrong_format);
+ 
+       /* We continue, so we can catch further errors.  */
+       r_extern = 0;
+       r_index = N_ABS;
+     }
+ 
+   /* Magically uses r_extern, symbols etc.  Ugly, but it's what's in the
+      default.  */
+   MOVE_ADDRESS (GET_SWORD (abfd, bytes->r_addend));
+ }
+ 
+ 
+ /* We use the same as the default, except that we also set
+    "obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;", to avoid changing
+    NAME (aout, set_arch_mach) in aoutx.  */
+ 
+ static boolean
+ MY(set_sizes) (abfd)
+      bfd *abfd;
+ {
+   /* Just as the default in aout-target.h (with some #ifdefs folded)...  */
+ 
+   adata(abfd).page_size = TARGET_PAGE_SIZE;
+   adata(abfd).segment_size = SEGMENT_SIZE;
+   adata(abfd).zmagic_disk_block_size = ZMAGIC_DISK_BLOCK_SIZE;
+   adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
+ 
+   /* ... except for that we have the extended reloc.  The alternative
+      would be to add a check on bfd_arch_cris in NAME (aout,
+      set_arch_mach) in aoutx.h, but I don't want to do that since
+      target-specific things should not be added there.  */
+ 
+   obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
+   
+   return true;
+ }
+ 
+ /*
+  * Local variables:
+  * eval: (c-set-style "gnu")
+  * indent-tabs-mode: t
+  * End:
+  */
*** /dev/null	Tue Jan  1 05:00:00 1980
--- elf32-cris.c	Tue Jul 18 18:59:52 2000
***************
*** 0 ****
--- 1,601 ----
+ /* CRIS-specific support for 32-bit ELF.
+    Copyright (C) 2000 Free Software Foundation, Inc.
+    Contributed by Axis Communications AB.
+    Written by Hans-Peter Nilsson, based on elf32-fr30.c
+ 
+ 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.  */
+ 
+ #include "bfd.h"
+ #include "sysdep.h"
+ #include "libbfd.h"
+ #include "elf-bfd.h"
+ #include "elf/cris.h"
+ 
+ /* Forward declarations.  */
+ static reloc_howto_type * cris_reloc_type_lookup
+   PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
+ 
+ static void cris_info_to_howto_rela 
+   PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
+ 
+ static boolean cris_elf_relocate_section 
+   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
+ 	   Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
+ 
+ static bfd_reloc_status_type cris_final_link_relocate
+   PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *,
+ 	   Elf_Internal_Rela *, bfd_vma));
+ 
+ static boolean cris_elf_gc_sweep_hook
+   PARAMS ((bfd *, struct bfd_link_info *, asection *,
+ 	   const Elf_Internal_Rela *));
+ 
+ static asection * cris_elf_gc_mark_hook
+   PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
+ 	   struct elf_link_hash_entry *, Elf_Internal_Sym *));
+ 
+ static reloc_howto_type cris_elf_howto_table [] =
+ {
+   /* This reloc does nothing.  */
+   HOWTO (R_CRIS_NONE,		/* type */
+ 	 0,			/* rightshift */
+ 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 32,			/* bitsize */
+ 	 false,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_NONE",		/* name */
+ 	 false,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0,			/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* An 8 bit absolute relocation.  */
+   HOWTO (R_CRIS_8,		/* type */
+ 	 0,			/* rightshift */
+ 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 8,			/* bitsize */
+ 	 false,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_8",		/* name */
+ 	 false,			/* partial_inplace */
+ 	 0x0000,		/* src_mask */
+ 	 0x00ff,		/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* A 16 bit absolute relocation.  */
+   HOWTO (R_CRIS_16,		/* type */
+ 	 0,			/* rightshift */
+ 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 16,			/* bitsize */
+ 	 false,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_16",		/* name */
+ 	 false,			/* partial_inplace */
+ 	 0x00000000,		/* src_mask */
+ 	 0x0000ffff,		/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* A 32 bit absolute relocation.  */
+   HOWTO (R_CRIS_32,		/* type */
+ 	 0,			/* rightshift */
+ 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 32,			/* bitsize */
+ 	 false,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_32",		/* name */
+ 	 false,			/* partial_inplace */
+ 	 0x00000000,		/* src_mask */
+ 	 0xffffffff,		/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* An 8 bit absolute relocation.  */
+   HOWTO (R_CRIS_8_PCREL,	/* type */
+ 	 0,			/* rightshift */
+ 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 8,			/* bitsize */
+ 	 true,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_8_PCREL",	/* name */
+ 	 false,			/* partial_inplace */
+ 	 0x0000,		/* src_mask */
+ 	 0x00ff,		/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* A 16 bit absolute relocation.  */
+   HOWTO (R_CRIS_16_PCREL,	/* type */
+ 	 0,			/* rightshift */
+ 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 16,			/* bitsize */
+ 	 true,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_16",		/* name */
+ 	 false,			/* partial_inplace */
+ 	 0x00000000,		/* src_mask */
+ 	 0x0000ffff,		/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* A 32 bit absolute relocation.  */
+   HOWTO (R_CRIS_32_PCREL,	/* type */
+ 	 0,			/* rightshift */
+ 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 32,			/* bitsize */
+ 	 true,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_bitfield, /* complain_on_overflow */
+ 	 bfd_elf_generic_reloc,	/* special_function */
+ 	 "R_CRIS_32",		/* name */
+ 	 false,			/* partial_inplace */
+ 	 0x00000000,		/* src_mask */
+ 	 0xffffffff,		/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* GNU extension to record C++ vtable hierarchy */
+   HOWTO (R_CRIS_GNU_VTINHERIT, /* type */
+ 	 0,			/* rightshift */
+ 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 0,			/* bitsize */
+ 	 false,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_dont, /* complain_on_overflow */
+ 	 NULL,			/* special_function */
+ 	 "R_CRIS_GNU_VTINHERIT", /* name */
+ 	 false,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0,			/* dst_mask */
+ 	 false),		/* pcrel_offset */
+ 
+   /* GNU extension to record C++ vtable member usage */
+   HOWTO (R_CRIS_GNU_VTENTRY,	 /* type */
+ 	 0,			/* rightshift */
+ 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+ 	 0,			/* bitsize */
+ 	 false,			/* pc_relative */
+ 	 0,			/* bitpos */
+ 	 complain_overflow_dont, /* complain_on_overflow */
+ 	 _bfd_elf_rel_vtable_reloc_fn,	/* special_function */
+ 	 "R_CRIS_GNU_VTENTRY",	 /* name */
+ 	 false,			/* partial_inplace */
+ 	 0,			/* src_mask */
+ 	 0,			/* dst_mask */
+ 	 false)			/* pcrel_offset */
+ };
+ 
+ /* Map BFD reloc types to CRIS ELF reloc types.  */
+ 
+ struct cris_reloc_map
+ {
+   bfd_reloc_code_real_type bfd_reloc_val;
+   unsigned int cris_reloc_val;
+ };
+ 
+ static const struct cris_reloc_map cris_reloc_map [] =
+ {
+   { BFD_RELOC_NONE,		R_CRIS_NONE },
+   { BFD_RELOC_8,		R_CRIS_8 },
+   { BFD_RELOC_16,		R_CRIS_16 },
+   { BFD_RELOC_32,		R_CRIS_32 },
+   { BFD_RELOC_8_PCREL,		R_CRIS_8_PCREL },
+   { BFD_RELOC_16_PCREL,		R_CRIS_16_PCREL },
+   { BFD_RELOC_32_PCREL,		R_CRIS_32_PCREL },
+   { BFD_RELOC_VTABLE_INHERIT,	R_CRIS_GNU_VTINHERIT },
+   { BFD_RELOC_VTABLE_ENTRY,	R_CRIS_GNU_VTENTRY }
+ };
+ 
+ static reloc_howto_type *
+ cris_reloc_type_lookup (abfd, code)
+      bfd * abfd ATTRIBUTE_UNUSED;
+      bfd_reloc_code_real_type code;
+ {
+   unsigned int i;
+ 
+   for (i = sizeof (cris_reloc_map) / sizeof (cris_reloc_map[0]);
+        --i;)
+     if (cris_reloc_map [i].bfd_reloc_val == code)
+       return & cris_elf_howto_table [cris_reloc_map[i].cris_reloc_val];
+   
+   return NULL;
+ }
+ 
+ /* Set the howto pointer for an CRIS ELF reloc.  */
+ 
+ static void
+ cris_info_to_howto_rela (abfd, cache_ptr, dst)
+      bfd * abfd ATTRIBUTE_UNUSED;
+      arelent * cache_ptr;
+      Elf32_Internal_Rela * dst;
+ {
+   unsigned int r_type;
+ 
+   r_type = ELF32_R_TYPE (dst->r_info);
+   BFD_ASSERT (r_type < (unsigned int) R_CRIS_max);
+   cache_ptr->howto = & cris_elf_howto_table [r_type];
+ }
+ 
+ /* Perform a single relocation.  By default we use the standard BFD
+    routines, but we might have to do a few relocs ourselves in the future.  */
+ 
+ static bfd_reloc_status_type
+ cris_final_link_relocate (howto, input_bfd, input_section, contents, rel,
+ 			  relocation)
+      reloc_howto_type *  howto;
+      bfd *               input_bfd;
+      asection *          input_section;
+      bfd_byte *          contents;
+      Elf_Internal_Rela * rel;
+      bfd_vma             relocation;
+ {
+   bfd_reloc_status_type r
+     = _bfd_final_link_relocate (howto, input_bfd, input_section,
+ 				contents, rel->r_offset,
+ 				relocation, rel->r_addend);
+   return r;
+ }
+ 
+ /* Relocate an CRIS ELF section.  See elf32-fr30.c, from where this was
+    copied, for further comments.  */
+ 
+ static boolean
+ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
+ 			   contents, relocs, local_syms, local_sections)
+      bfd *                   output_bfd ATTRIBUTE_UNUSED;
+      struct bfd_link_info *  info;
+      bfd *                   input_bfd;
+      asection *              input_section;
+      bfd_byte *              contents;
+      Elf_Internal_Rela *     relocs;
+      Elf_Internal_Sym *      local_syms;
+      asection **             local_sections;
+ {
+   Elf_Internal_Shdr *           symtab_hdr;
+   struct elf_link_hash_entry ** sym_hashes;
+   Elf_Internal_Rela *           rel;
+   Elf_Internal_Rela *           relend;
+ 
+   symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
+   sym_hashes = elf_sym_hashes (input_bfd);
+   relend     = relocs + input_section->reloc_count;
+ 
+   /* It seems this can happen with erroneous or unsupported input (mixing
+      a.out and elf in an archive, for example.)  */
+   if (sym_hashes == NULL)
+     return false;
+ 
+   for (rel = relocs; rel < relend; rel ++)
+     {
+       reloc_howto_type *           howto;
+       unsigned long                r_symndx;
+       Elf_Internal_Sym *           sym;
+       asection *                   sec;
+       struct elf_link_hash_entry * h;
+       bfd_vma                      relocation;
+       bfd_reloc_status_type        r;
+       const char *                 name = NULL;
+       int                          r_type;
+       
+       r_type = ELF32_R_TYPE (rel->r_info);
+       
+       if (   r_type == R_CRIS_GNU_VTINHERIT
+ 	  || r_type == R_CRIS_GNU_VTENTRY)
+ 	continue;
+       
+       r_symndx = ELF32_R_SYM (rel->r_info);
+ 
+       if (info->relocateable)
+ 	{
+ 	  /* This is a relocateable link.  We don't have to change
+              anything, unless the reloc is against a section symbol,
+              in which case we have to adjust according to where the
+              section symbol winds up in the output section.  */
+ 	  if (r_symndx < symtab_hdr->sh_info)
+ 	    {
+ 	      sym = local_syms + r_symndx;
+ 	      
+ 	      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+ 		{
+ 		  sec = local_sections [r_symndx];
+ 		  rel->r_addend += sec->output_offset + sym->st_value;
+ 		}
+ 	    }
+ 
+ 	  continue;
+ 	}
+ 
+       /* This is a final link.  */
+       howto  = cris_elf_howto_table + ELF32_R_TYPE (rel->r_info);
+       h      = NULL;
+       sym    = NULL;
+       sec    = NULL;
+       
+       if (r_symndx < symtab_hdr->sh_info)
+ 	{
+ 	  sym = local_syms + r_symndx;
+ 	  sec = local_sections [r_symndx];
+ 	  relocation = (sec->output_section->vma
+ 			+ sec->output_offset
+ 			+ sym->st_value);
+ 	  
+ 	  name = bfd_elf_string_from_elf_section
+ 	    (input_bfd, symtab_hdr->sh_link, sym->st_name);
+ 	  name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+ #if 0
+ 	  fprintf (stderr, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
+ 		   sec->name, name, sym->st_name,
+ 		   sec->output_section->vma, sec->output_offset,
+ 		   sym->st_value, rel->r_addend);
+ #endif
+ 	}
+       else
+ 	{
+ 	  h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+ 	  
+ 	  while (h->root.type == bfd_link_hash_indirect
+ 		 || h->root.type == bfd_link_hash_warning)
+ 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ 
+ 	  name = h->root.root.string;
+ 	  
+ 	  if (h->root.type == bfd_link_hash_defined
+ 	      || h->root.type == bfd_link_hash_defweak)
+ 	    {
+ 	      sec = h->root.u.def.section;
+ 	      relocation = (h->root.u.def.value
+ 			    + sec->output_section->vma
+ 			    + sec->output_offset);
+ #if 0
+ 	      fprintf (stderr,
+ 		       "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
+ 		       sec->name, name, h->root.u.def.value,
+ 		       sec->output_section->vma, sec->output_offset, relocation);
+ #endif
+ 	    }
+ 	  else if (h->root.type == bfd_link_hash_undefweak)
+ 	    {
+ #if 0
+ 	      fprintf (stderr, "undefined: sec: %s, name: %s\n",
+ 		       sec->name, name);
+ #endif
+ 	      relocation = 0;
+ 	    }
+ 	  else if (info->shared
+ 		   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
+ 	    relocation = 0;
+ 	  else
+ 	    {
+ 	      if (! ((*info->callbacks->undefined_symbol)
+ 		     (info, h->root.root.string, input_bfd,
+ 		      input_section, rel->r_offset, true)))
+ 		return false;
+ #if 0
+ 	      fprintf (stderr, "unknown: name: %s\n", name);
+ #endif
+ 	      relocation = 0;
+ 	    }
+ 	}
+       
+       r = cris_final_link_relocate (howto, input_bfd, input_section,
+ 				     contents, rel, relocation);
+ 
+       if (r != bfd_reloc_ok)
+ 	{
+ 	  const char * msg = (const char *) NULL;
+ 
+ 	  switch (r)
+ 	    {
+ 	    case bfd_reloc_overflow:
+ 	      r = info->callbacks->reloc_overflow
+ 		(info, name, howto->name, (bfd_vma) 0,
+ 		 input_bfd, input_section, rel->r_offset);
+ 	      break;
+ 	      
+ 	    case bfd_reloc_undefined:
+ 	      r = info->callbacks->undefined_symbol
+ 		(info, name, input_bfd, input_section, rel->r_offset,
+ 		 true);
+ 	      break;
+ 	      
+ 	    case bfd_reloc_outofrange:
+ 	      msg = _("internal error: out of range error");
+ 	      break;
+ 
+ 	    case bfd_reloc_notsupported:
+ 	      msg = _("internal error: unsupported relocation error");
+ 	      break;
+ 
+ 	    case bfd_reloc_dangerous:
+ 	      msg = _("internal error: dangerous relocation");
+ 	      break;
+ 
+ 	    default:
+ 	      msg = _("internal error: unknown error");
+ 	      break;
+ 	    }
+ 
+ 	  if (msg)
+ 	    r = info->callbacks->warning
+ 	      (info, msg, name, input_bfd, input_section, rel->r_offset);
+ 
+ 	  if (! r)
+ 	    return false;
+ 	}
+     }
+ 
+   return true;
+ }
+ 
+ /* Return the section that should be marked against GC for a given
+    relocation.  */
+ 
+ static asection *
+ cris_elf_gc_mark_hook (abfd, info, rel, h, sym)
+      bfd *                        abfd;
+      struct bfd_link_info *       info ATTRIBUTE_UNUSED;
+      Elf_Internal_Rela *          rel;
+      struct elf_link_hash_entry * h;
+      Elf_Internal_Sym *           sym;
+ {
+   if (h != NULL)
+     {
+       switch (ELF32_R_TYPE (rel->r_info))
+ 	{
+ 	case R_CRIS_GNU_VTINHERIT:
+ 	case R_CRIS_GNU_VTENTRY:
+ 	  break;
+ 
+ 	default:
+ 	  switch (h->root.type)
+ 	    {
+ 	    case bfd_link_hash_defined:
+ 	    case bfd_link_hash_defweak:
+ 	      return h->root.u.def.section;
+ 
+ 	    case bfd_link_hash_common:
+ 	      return h->root.u.c.p->section;
+ 
+ 	    default:
+ 	      break;
+ 	    }
+ 	}
+     }
+   else
+     {
+       if (!(elf_bad_symtab (abfd)
+ 	    && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
+ 	  && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
+ 		&& sym->st_shndx != SHN_COMMON))
+ 	{
+ 	  return bfd_section_from_elf_index (abfd, sym->st_shndx);
+ 	}
+     }
+ 
+   return NULL;
+ }
+ 
+ /* Update the got entry reference counts for the section being removed.  */
+ 
+ static boolean
+ cris_elf_gc_sweep_hook (abfd, info, sec, relocs)
+      bfd *                     abfd ATTRIBUTE_UNUSED;
+      struct bfd_link_info *    info ATTRIBUTE_UNUSED;
+      asection *                sec ATTRIBUTE_UNUSED;
+      const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED;
+ {
+   return true;
+ }
+ 
+ /* Look through the relocs for a section during the first phase.
+    Since we don't do .gots or .plts, we just need to consider the
+    virtual table relocs for gc.  */
+  
+ static boolean
+ cris_elf_check_relocs (abfd, info, sec, relocs)
+      bfd *abfd;
+      struct bfd_link_info *info;
+      asection *sec;
+      const Elf_Internal_Rela *relocs;
+ {
+   Elf_Internal_Shdr *symtab_hdr;
+   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
+   const Elf_Internal_Rela *rel;
+   const Elf_Internal_Rela *rel_end;
+  
+   if (info->relocateable)
+     return true;
+  
+   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+   sym_hashes = elf_sym_hashes (abfd);
+   sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
+   if (!elf_bad_symtab (abfd))
+     sym_hashes_end -= symtab_hdr->sh_info;
+  
+   rel_end = relocs + sec->reloc_count;
+   for (rel = relocs; rel < rel_end; rel++)
+     {
+       struct elf_link_hash_entry *h;
+       unsigned long r_symndx;
+  
+       r_symndx = ELF32_R_SYM (rel->r_info);
+       if (r_symndx < symtab_hdr->sh_info)
+         h = NULL;
+       else
+         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+  
+       switch (ELF32_R_TYPE (rel->r_info))
+         {
+         /* This relocation describes the C++ object vtable hierarchy.
+            Reconstruct it for later use during GC.  */
+         case R_CRIS_GNU_VTINHERIT:
+           if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+             return false;
+           break;
+  
+         /* This relocation describes which C++ vtable entries are actually
+            used.  Record for later use during GC.  */
+         case R_CRIS_GNU_VTENTRY:
+           if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+             return false;
+           break;
+         }
+     }
+  
+   return true;
+ }
+ 
+ #define ELF_ARCH		bfd_arch_cris
+ #define ELF_MACHINE_CODE	EM_CRIS
+ #define ELF_MAXPAGESIZE		0x2000
+ 
+ #define TARGET_LITTLE_SYM	bfd_elf32_cris_vec
+ #define TARGET_LITTLE_NAME	"elf32-cris"
+ 
+ /* For the time being, we have a leading underscore.  Perhaps change to 0
+    later, when
+    1) a.out isn't as dominating, and we can forget about multiformat links
+       and old assembly code.
+    2) there's an official solution to the symbol vs. register duality
+       problem; perhaps a % register prefix, optionally enforced.  */
+ #define elf_symbol_leading_char '_'
+ 
+ #define elf_info_to_howto_rel			NULL
+ #define elf_info_to_howto			cris_info_to_howto_rela
+ #define elf_backend_relocate_section		cris_elf_relocate_section
+ #define elf_backend_gc_mark_hook		cris_elf_gc_mark_hook
+ #define elf_backend_gc_sweep_hook		cris_elf_gc_sweep_hook
+ #define elf_backend_check_relocs                cris_elf_check_relocs
+ 
+ #define elf_backend_can_gc_sections		1
+ 
+ #define bfd_elf32_bfd_reloc_type_lookup		cris_reloc_type_lookup
+ 
+ /* Later, we my want to optimize RELA entries into REL entries for dynamic
+    linking and libraries (if it's a win of any significance).  Until then,
+    take the easy route.  */
+ #define elf_backend_may_use_rel_p 0
+ #define elf_backend_may_use_rela_p 1
+ 
+ #include "elf32-target.h"

brgds, H-P

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]