This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
[rfa:] CRIS port part 3/8: bfd
- To: binutils at sources dot redhat dot com
- Subject: [rfa:] CRIS port part 3/8: bfd
- From: Hans-Peter Nilsson <hans-peter dot nilsson at axis dot com>
- Date: Tue, 18 Jul 2000 23:57:32 +0200
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