diff options
author | Ian Lance Taylor <ian@airs.com> | 1993-08-04 16:36:10 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1993-08-04 16:36:10 +0000 |
commit | e4b6b3e71bd600c9ff393c9dd6d05379c7774082 (patch) | |
tree | 09d897a74890ead61c5f2a0d557817def8e8a871 /bfd/elf32-i386.c | |
parent | eea92b244242cd2e1ce682d9f83e9384608534f6 (diff) | |
download | binutils-gdb-e4b6b3e71bd600c9ff393c9dd6d05379c7774082.tar.gz |
* coff-h8500.c (rtype2howto): Do an fprintf to stderr rather than
using printf.
* coff-z8k.c (rtype2howto): Likewise.
* coffcode.h (dummy_reloc16_extra_cases): Likewise.
* elf32-i386.c (TRACE): Likewise.
* hp300hpux.c (convert_sym_type, swap_std_reloc_in): Likewise.
* rs6000-core.c (rs6000coff_get_section_contents): Likewise.
* coffgen.c (coff_print_symbol): Do an fprintf to the file
argument rather than using printf.
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r-- | bfd/elf32-i386.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c new file mode 100644 index 00000000000..9ead8bf1b09 --- /dev/null +++ b/bfd/elf32-i386.c @@ -0,0 +1,127 @@ +/* Intel 80386/80486-specific support for 32-bit ELF + Copyright 1993 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* + * This file contains changes from the Open Software Foundation. + */ + +#include "bfd.h" +#include "sysdep.h" +#include "libbfd.h" +#include "libelf.h" + +#define USE_REL 1 /* 386 uses REL relocations instead of RELA */ + +enum reloc_type + { + R_386_NONE = 0, + R_386_32, R_386_PC32, + R_386_GOT32, R_386_PLT32, + R_386_COPY, + R_386_GLOB_DAT, R_386_JUMP_SLOT, + R_386_RELATIVE, + R_386_GOTOFF, R_386_GOTPC, + R_386_max + }; + +#if 0 +static CONST char *CONST reloc_type_names[] = +{ + "R_386_NONE", + "R_386_32", "R_386_PC32", + "R_386_GOT32", "R_386_PLT32", + "R_386_COPY", + "R_386_GLOB_DAT", "R_386_JUMP_SLOT", + "R_386_RELATIVE", + "R_386_GOTOFF", "R_386_GOTPC", +}; +#endif + + +static reloc_howto_type elf_howto_table[]= +{ + HOWTO(R_386_NONE, 0,0, 0,false,0, complain_overflow_dont, 0,"R_386_NONE", false,0x00000000,0x00000000,false), + HOWTO(R_386_32, 0,2,32,false,0, complain_overflow_bitfield, 0,"R_386_32", false,0xffffffff,0xffffffff,false), + HOWTO(R_386_PC32, 0,2,32,true, 0, complain_overflow_signed, 0,"R_386_PC32", false,0xffffffff,0xffffffff,false), + HOWTO(R_386_GOT32, 0,2,32,false,0, complain_overflow_bitfield, 0,"R_386_GOT32",false,0xffffffff,0xffffffff,false) +}; + +#ifdef DEBUG_GEN_RELOC +#define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str) +#else +#define TRACE(str) +#endif + +static CONST struct reloc_howto_struct * +DEFUN (elf_i386_reloc_type_lookup, (abfd, code), + bfd *abfd AND + bfd_reloc_code_real_type code) +{ + switch (code) + { + case BFD_RELOC_NONE: + TRACE ("BFD_RELOC_NONE"); + return &elf_howto_table[ (int)R_386_NONE ]; + + case BFD_RELOC_32: + TRACE ("BFD_RELOC_32"); + return &elf_howto_table[ (int)R_386_32 ]; + + case BFD_RELOC_32_PCREL: + TRACE ("BFD_RELOC_PC32"); + return &elf_howto_table[ (int)R_386_PC32 ]; + + default: + abort (); + } + + TRACE ("Unknown"); + return 0; +} + +static void +DEFUN(elf_i386_info_to_howto, (abfd, cache_ptr, dst), + bfd *abfd AND + arelent *cache_ptr AND + Elf32_Internal_Rela *dst) +{ + BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < R_386_GOT32); + + cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)]; +} + +static void +DEFUN(elf_i386_info_to_howto_rel, (abfd, cache_ptr, dst), + bfd *abfd AND + arelent *cache_ptr AND + Elf32_Internal_Rel *dst) +{ + BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < R_386_GOT32); + + cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)]; +} + +#define TARGET_LITTLE_SYM bfd_elf32_i386_vec +#define TARGET_LITTLE_NAME "elf32-i386" +#define ELF_ARCH bfd_arch_i386 +#define elf_info_to_howto elf_i386_info_to_howto +#define elf_info_to_howto_rel elf_i386_info_to_howto_rel +#define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup + +#include "elf32-target.h" |