1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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"
|