1 |
/* SH ELF support for BFD. |
/* SH ELF support for BFD. |
2 |
Copyright 1998, 2000, 2001, 2002 Free Software Foundation, Inc. |
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. |
3 |
|
|
4 |
This file is part of BFD, the Binary File Descriptor library. |
This file is part of BFD, the Binary File Descriptor library. |
5 |
|
|
27 |
#define EF_SH1 1 |
#define EF_SH1 1 |
28 |
#define EF_SH2 2 |
#define EF_SH2 2 |
29 |
#define EF_SH3 3 |
#define EF_SH3 3 |
|
#define EF_SH_HAS_DSP(flags) ((flags) & 4) |
|
30 |
#define EF_SH_DSP 4 |
#define EF_SH_DSP 4 |
31 |
#define EF_SH3_DSP 5 |
#define EF_SH3_DSP 5 |
32 |
#define EF_SH_HAS_FP(flags) ((flags) & 8) |
#define EF_SH4AL_DSP 6 |
33 |
#define EF_SH3E 8 |
#define EF_SH3E 8 |
34 |
#define EF_SH4 9 |
#define EF_SH4 9 |
35 |
|
#define EF_SH2E 11 |
36 |
|
#define EF_SH4A 12 |
37 |
|
#define EF_SH2A 13 |
38 |
|
|
39 |
|
#define EF_SH4_NOFPU 16 |
40 |
|
#define EF_SH4A_NOFPU 17 |
41 |
|
#define EF_SH4_NOMMU_NOFPU 18 |
42 |
|
#define EF_SH2A_NOFPU 19 |
43 |
|
#define EF_SH3_NOMMU 20 |
44 |
|
|
45 |
|
#define EF_SH2A_SH4_NOFPU 21 |
46 |
|
#define EF_SH2A_SH3_NOFPU 22 |
47 |
|
#define EF_SH2A_SH4 23 |
48 |
|
#define EF_SH2A_SH3E 24 |
49 |
|
|
50 |
/* This one can only mix in objects from other EF_SH5 objects. */ |
/* This one can only mix in objects from other EF_SH5 objects. */ |
51 |
#define EF_SH5 10 |
#define EF_SH5 10 |
52 |
|
|
53 |
#define EF_SH_MERGE_MACH(mach1, mach2) \ |
/* Define the mapping from ELF to bfd mach numbers. |
54 |
(((((mach1) == EF_SH3 || (mach1) == EF_SH_UNKNOWN) && (mach2) == EF_SH_DSP) \ |
bfd_mach_* are defined in bfd_in2.h (generated from |
55 |
|| ((mach1) == EF_SH_DSP \ |
archures.c). */ |
56 |
&& ((mach2) == EF_SH3 || (mach2) == EF_SH_UNKNOWN))) \ |
#define EF_SH_BFD_TABLE \ |
57 |
? EF_SH3_DSP \ |
/* EF_SH_UNKNOWN */ bfd_mach_sh3 , \ |
58 |
: (((mach1) < EF_SH3 && (mach2) == EF_SH_UNKNOWN) \ |
/* EF_SH1 */ bfd_mach_sh , \ |
59 |
|| ((mach2) < EF_SH3 && (mach1) == EF_SH_UNKNOWN)) \ |
/* EF_SH2 */ bfd_mach_sh2 , \ |
60 |
? EF_SH3 \ |
/* EF_SH3 */ bfd_mach_sh3 , \ |
61 |
: (((mach1) == EF_SH3E && (mach2) == EF_SH_UNKNOWN) \ |
/* EF_SH_DSP */ bfd_mach_sh_dsp , \ |
62 |
|| ((mach2) == EF_SH3E && (mach1) == EF_SH_UNKNOWN)) \ |
/* EF_SH3_DSP */ bfd_mach_sh3_dsp , \ |
63 |
? EF_SH4 \ |
/* EF_SHAL_DSP */ bfd_mach_sh4al_dsp , \ |
64 |
: ((mach1) > (mach2) ? (mach1) : (mach2))) |
/* 7 */ 0, \ |
65 |
|
/* EF_SH3E */ bfd_mach_sh3e , \ |
66 |
|
/* EF_SH4 */ bfd_mach_sh4 , \ |
67 |
|
/* EF_SH5 */ 0, \ |
68 |
|
/* EF_SH2E */ bfd_mach_sh2e , \ |
69 |
|
/* EF_SH4A */ bfd_mach_sh4a , \ |
70 |
|
/* EF_SH2A */ bfd_mach_sh2a , \ |
71 |
|
/* 14, 15 */ 0, 0, \ |
72 |
|
/* EF_SH4_NOFPU */ bfd_mach_sh4_nofpu , \ |
73 |
|
/* EF_SH4A_NOFPU */ bfd_mach_sh4a_nofpu , \ |
74 |
|
/* EF_SH4_NOMMU_NOFPU */ bfd_mach_sh4_nommu_nofpu, \ |
75 |
|
/* EF_SH2A_NOFPU */ bfd_mach_sh2a_nofpu , \ |
76 |
|
/* EF_SH3_NOMMU */ bfd_mach_sh3_nommu , \ |
77 |
|
/* EF_SH2A_SH4_NOFPU */ bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, \ |
78 |
|
/* EF_SH2A_SH3_NOFPU */ bfd_mach_sh2a_nofpu_or_sh3_nommu, \ |
79 |
|
/* EF_SH2A_SH4 */ bfd_mach_sh2a_or_sh4 , \ |
80 |
|
/* EF_SH2A_SH3E */ bfd_mach_sh2a_or_sh3e |
81 |
|
|
82 |
|
/* Convert arch_sh* into EF_SH*. */ |
83 |
|
int sh_find_elf_flags (unsigned int arch_set); |
84 |
|
|
85 |
|
/* Convert bfd_mach_* into EF_SH*. */ |
86 |
|
int sh_elf_get_flags_from_mach (unsigned long mach); |
87 |
|
|
88 |
/* Flags for the st_other symbol field. |
/* Flags for the st_other symbol field. |
89 |
Keep away from the STV_ visibility flags (bit 0..1). */ |
Keep away from the STV_ visibility flags (bit 0..1). */ |
106 |
symbols). */ |
symbols). */ |
107 |
#define STT_DATALABEL STT_LOPROC |
#define STT_DATALABEL STT_LOPROC |
108 |
|
|
|
#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 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 *)); |
|
|
|
|
|
/* We put this in elf_section_data (section)->tdata. */ |
|
|
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; |
|
|
}; |
|
|
|
|
|
#define sh64_elf_section_data(sec) \ |
|
|
((struct sh64_section_data *) ((elf_section_data (sec))->tdata)) |
|
|
|
|
109 |
#include "elf/reloc-macros.h" |
#include "elf/reloc-macros.h" |
110 |
|
|
111 |
/* Relocations. */ |
/* Relocations. */ |
112 |
/* Relocations 25ff are GNU extensions. |
/* Relocations 10-32 and 128-255 are GNU extensions. |
113 |
25..33 are used for relaxation and use the same constants as COFF uses. */ |
25..32 and 10 are used for relaxation. */ |
114 |
START_RELOC_NUMBERS (elf_sh_reloc_type) |
START_RELOC_NUMBERS (elf_sh_reloc_type) |
115 |
RELOC_NUMBER (R_SH_NONE, 0) |
RELOC_NUMBER (R_SH_NONE, 0) |
116 |
RELOC_NUMBER (R_SH_DIR32, 1) |
RELOC_NUMBER (R_SH_DIR32, 1) |
122 |
RELOC_NUMBER (R_SH_DIR8BP, 7) |
RELOC_NUMBER (R_SH_DIR8BP, 7) |
123 |
RELOC_NUMBER (R_SH_DIR8W, 8) |
RELOC_NUMBER (R_SH_DIR8W, 8) |
124 |
RELOC_NUMBER (R_SH_DIR8L, 9) |
RELOC_NUMBER (R_SH_DIR8L, 9) |
125 |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 10) |
|
126 |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 24) |
RELOC_NUMBER (R_SH_LOOP_START, 10) |
127 |
|
RELOC_NUMBER (R_SH_LOOP_END, 11) |
128 |
|
|
129 |
|
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 12) |
130 |
|
FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 21) |
131 |
|
|
132 |
|
RELOC_NUMBER (R_SH_GNU_VTINHERIT, 22) |
133 |
|
RELOC_NUMBER (R_SH_GNU_VTENTRY, 23) |
134 |
|
RELOC_NUMBER (R_SH_SWITCH8, 24) |
135 |
RELOC_NUMBER (R_SH_SWITCH16, 25) |
RELOC_NUMBER (R_SH_SWITCH16, 25) |
136 |
RELOC_NUMBER (R_SH_SWITCH32, 26) |
RELOC_NUMBER (R_SH_SWITCH32, 26) |
137 |
RELOC_NUMBER (R_SH_USES, 27) |
RELOC_NUMBER (R_SH_USES, 27) |
140 |
RELOC_NUMBER (R_SH_CODE, 30) |
RELOC_NUMBER (R_SH_CODE, 30) |
141 |
RELOC_NUMBER (R_SH_DATA, 31) |
RELOC_NUMBER (R_SH_DATA, 31) |
142 |
RELOC_NUMBER (R_SH_LABEL, 32) |
RELOC_NUMBER (R_SH_LABEL, 32) |
143 |
RELOC_NUMBER (R_SH_SWITCH8, 33) |
|
144 |
RELOC_NUMBER (R_SH_GNU_VTINHERIT, 34) |
RELOC_NUMBER (R_SH_DIR16, 33) |
145 |
RELOC_NUMBER (R_SH_GNU_VTENTRY, 35) |
RELOC_NUMBER (R_SH_DIR8, 34) |
146 |
RELOC_NUMBER (R_SH_LOOP_START, 36) |
RELOC_NUMBER (R_SH_DIR8UL, 35) |
147 |
RELOC_NUMBER (R_SH_LOOP_END, 37) |
RELOC_NUMBER (R_SH_DIR8UW, 36) |
148 |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 38) |
RELOC_NUMBER (R_SH_DIR8U, 37) |
149 |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 44) |
RELOC_NUMBER (R_SH_DIR8SW, 38) |
150 |
|
RELOC_NUMBER (R_SH_DIR8S, 39) |
151 |
|
RELOC_NUMBER (R_SH_DIR4UL, 40) |
152 |
|
RELOC_NUMBER (R_SH_DIR4UW, 41) |
153 |
|
RELOC_NUMBER (R_SH_DIR4U, 42) |
154 |
|
RELOC_NUMBER (R_SH_PSHA, 43) |
155 |
|
RELOC_NUMBER (R_SH_PSHL, 44) |
156 |
RELOC_NUMBER (R_SH_DIR5U, 45) |
RELOC_NUMBER (R_SH_DIR5U, 45) |
157 |
RELOC_NUMBER (R_SH_DIR6U, 46) |
RELOC_NUMBER (R_SH_DIR6U, 46) |
158 |
RELOC_NUMBER (R_SH_DIR6S, 47) |
RELOC_NUMBER (R_SH_DIR6S, 47) |
160 |
RELOC_NUMBER (R_SH_DIR10SW, 49) |
RELOC_NUMBER (R_SH_DIR10SW, 49) |
161 |
RELOC_NUMBER (R_SH_DIR10SL, 50) |
RELOC_NUMBER (R_SH_DIR10SL, 50) |
162 |
RELOC_NUMBER (R_SH_DIR10SQ, 51) |
RELOC_NUMBER (R_SH_DIR10SQ, 51) |
163 |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 52) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 52) |
164 |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 159) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 52) |
165 |
|
RELOC_NUMBER (R_SH_DIR16S, 53) |
166 |
|
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 54) |
167 |
|
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 143) |
168 |
|
RELOC_NUMBER (R_SH_TLS_GD_32, 144) |
169 |
|
RELOC_NUMBER (R_SH_TLS_LD_32, 145) |
170 |
|
RELOC_NUMBER (R_SH_TLS_LDO_32, 146) |
171 |
|
RELOC_NUMBER (R_SH_TLS_IE_32, 147) |
172 |
|
RELOC_NUMBER (R_SH_TLS_LE_32, 148) |
173 |
|
RELOC_NUMBER (R_SH_TLS_DTPMOD32, 149) |
174 |
|
RELOC_NUMBER (R_SH_TLS_DTPOFF32, 150) |
175 |
|
RELOC_NUMBER (R_SH_TLS_TPOFF32, 151) |
176 |
|
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_4, 152) |
177 |
|
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_4, 159) |
178 |
RELOC_NUMBER (R_SH_GOT32, 160) |
RELOC_NUMBER (R_SH_GOT32, 160) |
179 |
RELOC_NUMBER (R_SH_PLT32, 161) |
RELOC_NUMBER (R_SH_PLT32, 161) |
180 |
RELOC_NUMBER (R_SH_COPY, 162) |
RELOC_NUMBER (R_SH_COPY, 162) |
212 |
RELOC_NUMBER (R_SH_GLOB_DAT64, 194) |
RELOC_NUMBER (R_SH_GLOB_DAT64, 194) |
213 |
RELOC_NUMBER (R_SH_JMP_SLOT64, 195) |
RELOC_NUMBER (R_SH_JMP_SLOT64, 195) |
214 |
RELOC_NUMBER (R_SH_RELATIVE64, 196) |
RELOC_NUMBER (R_SH_RELATIVE64, 196) |
215 |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_4, 197) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_5, 197) |
216 |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_4, 241) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_5, 241) |
217 |
RELOC_NUMBER (R_SH_SHMEDIA_CODE, 242) |
RELOC_NUMBER (R_SH_SHMEDIA_CODE, 242) |
218 |
RELOC_NUMBER (R_SH_PT_16, 243) |
RELOC_NUMBER (R_SH_PT_16, 243) |
219 |
RELOC_NUMBER (R_SH_IMMS16, 244) |
RELOC_NUMBER (R_SH_IMMS16, 244) |