00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #define OLD_ARM_ABI
00021 #define bfd_elf32_arm_allocate_interworking_sections \
00022 bfd_elf32_arm_oabi_allocate_interworking_sections
00023 #define bfd_elf32_arm_get_bfd_for_interworking \
00024 bfd_elf32_arm_oabi_get_bfd_for_interworking
00025 #define bfd_elf32_arm_process_before_allocation \
00026 bfd_elf32_arm_oabi_process_before_allocation
00027 #define bfd_elf32_arm_add_glue_sections_to_bfd \
00028 bfd_elf32_arm_oabi_add_glue_sections_to_bfd
00029
00030 #include "elf/arm.h"
00031 #include "bfd.h"
00032 #include "sysdep.h"
00033 #include "libbfd.h"
00034 #include "elf-bfd.h"
00035
00036 #ifndef NUM_ELEM
00037 #define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
00038 #endif
00039
00040 #define TARGET_LITTLE_SYM bfd_elf32_littlearm_oabi_vec
00041 #define TARGET_LITTLE_NAME "elf32-littlearm-oabi"
00042 #define TARGET_BIG_SYM bfd_elf32_bigarm_oabi_vec
00043 #define TARGET_BIG_NAME "elf32-bigarm-oabi"
00044
00045 #define elf_info_to_howto elf32_arm_info_to_howto
00046 #define elf_info_to_howto_rel 0
00047
00048 #define ARM_ELF_ABI_VERSION 0
00049 #define ARM_ELF_OS_ABI_VERSION 0
00050
00051 static reloc_howto_type * find_howto PARAMS ((unsigned int));
00052 static void elf32_arm_info_to_howto PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
00053 static reloc_howto_type * elf32_arm_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type));
00054
00055 static reloc_howto_type elf32_arm_howto_table[] =
00056 {
00057
00058 HOWTO (R_ARM_NONE,
00059 0,
00060 0,
00061 0,
00062 FALSE,
00063 0,
00064 complain_overflow_dont,
00065 bfd_elf_generic_reloc,
00066 "R_ARM_NONE",
00067 FALSE,
00068 0,
00069 0,
00070 FALSE),
00071
00072 HOWTO (R_ARM_PC24,
00073 2,
00074 2,
00075 24,
00076 TRUE,
00077 0,
00078 complain_overflow_signed,
00079 bfd_elf_generic_reloc,
00080 "R_ARM_PC24",
00081 FALSE,
00082 0x00ffffff,
00083 0x00ffffff,
00084 TRUE),
00085
00086
00087 HOWTO (R_ARM_ABS32,
00088 0,
00089 2,
00090 32,
00091 FALSE,
00092 0,
00093 complain_overflow_bitfield,
00094 bfd_elf_generic_reloc,
00095 "R_ARM_ABS32",
00096 FALSE,
00097 0xffffffff,
00098 0xffffffff,
00099 FALSE),
00100
00101
00102 HOWTO (R_ARM_REL32,
00103 0,
00104 2,
00105 32,
00106 TRUE,
00107 0,
00108 complain_overflow_bitfield,
00109 bfd_elf_generic_reloc,
00110 "R_ARM_REL32",
00111 FALSE,
00112 0xffffffff,
00113 0xffffffff,
00114 TRUE),
00115
00116
00117 HOWTO (R_ARM_ABS8,
00118 0,
00119 0,
00120 8,
00121 FALSE,
00122 0,
00123 complain_overflow_bitfield,
00124 bfd_elf_generic_reloc,
00125 "R_ARM_ABS8",
00126 FALSE,
00127 0x000000ff,
00128 0x000000ff,
00129 FALSE),
00130
00131
00132 HOWTO (R_ARM_ABS16,
00133 0,
00134 1,
00135 16,
00136 FALSE,
00137 0,
00138 complain_overflow_bitfield,
00139 bfd_elf_generic_reloc,
00140 "R_ARM_ABS16",
00141 FALSE,
00142 0,
00143 0,
00144 FALSE),
00145
00146
00147 HOWTO (R_ARM_ABS12,
00148 0,
00149 2,
00150 12,
00151 FALSE,
00152 0,
00153 complain_overflow_bitfield,
00154 bfd_elf_generic_reloc,
00155 "R_ARM_ABS12",
00156 FALSE,
00157 0x000008ff,
00158 0x000008ff,
00159 FALSE),
00160
00161 HOWTO (R_ARM_THM_ABS5,
00162 6,
00163 1,
00164 5,
00165 FALSE,
00166 0,
00167 complain_overflow_bitfield,
00168 bfd_elf_generic_reloc,
00169 "R_ARM_THM_ABS5",
00170 FALSE,
00171 0x000007e0,
00172 0x000007e0,
00173 FALSE),
00174
00175 HOWTO (R_ARM_THM_PC22,
00176 1,
00177 2,
00178 23,
00179 TRUE,
00180 0,
00181 complain_overflow_signed,
00182 bfd_elf_generic_reloc,
00183 "R_ARM_THM_PC22",
00184 FALSE,
00185 0x07ff07ff,
00186 0x07ff07ff,
00187 TRUE),
00188
00189 HOWTO (R_ARM_SBREL32,
00190 0,
00191 0,
00192 0,
00193 FALSE,
00194 0,
00195 complain_overflow_dont,
00196 bfd_elf_generic_reloc,
00197 "R_ARM_SBREL32",
00198 FALSE,
00199 0,
00200 0,
00201 FALSE),
00202
00203 HOWTO (R_ARM_AMP_VCALL9,
00204 1,
00205 1,
00206 8,
00207 TRUE,
00208 0,
00209 complain_overflow_signed,
00210 bfd_elf_generic_reloc,
00211 "R_ARM_AMP_VCALL9",
00212 FALSE,
00213 0x000000ff,
00214 0x000000ff,
00215 TRUE),
00216
00217
00218 HOWTO (R_ARM_THM_PC11,
00219 1,
00220 1,
00221 11,
00222 TRUE,
00223 0,
00224 complain_overflow_signed,
00225 bfd_elf_generic_reloc,
00226 "R_ARM_THM_PC11",
00227 FALSE,
00228 0x000007ff,
00229 0x000007ff,
00230 TRUE),
00231
00232
00233 HOWTO (R_ARM_THM_PC9,
00234 1,
00235 1,
00236 8,
00237 TRUE,
00238 0,
00239 complain_overflow_signed,
00240 bfd_elf_generic_reloc,
00241 "R_ARM_THM_PC9",
00242 FALSE,
00243 0x000000ff,
00244 0x000000ff,
00245 TRUE),
00246
00247
00248 HOWTO (R_ARM_GNU_VTINHERIT,
00249 0,
00250 2,
00251 0,
00252 FALSE,
00253 0,
00254 complain_overflow_dont,
00255 NULL,
00256 "R_ARM_GNU_VTINHERIT",
00257 FALSE,
00258 0,
00259 0,
00260 FALSE),
00261
00262
00263 HOWTO (R_ARM_GNU_VTENTRY,
00264 0,
00265 2,
00266 0,
00267 FALSE,
00268 0,
00269 complain_overflow_dont,
00270 _bfd_elf_rel_vtable_reloc_fn,
00271 "R_ARM_GNU_VTENTRY",
00272 FALSE,
00273 0,
00274 0,
00275 FALSE),
00276
00277
00278
00279 HOWTO (R_ARM_PLT32,
00280 2,
00281 2,
00282 26,
00283 TRUE,
00284 0,
00285 complain_overflow_bitfield,
00286 bfd_elf_generic_reloc,
00287 "R_ARM_PLT32",
00288 TRUE,
00289 0x00ffffff,
00290 0x00ffffff,
00291 TRUE),
00292
00293
00294
00295 HOWTO (R_ARM_RREL32,
00296 0,
00297 0,
00298 0,
00299 FALSE,
00300 0,
00301 complain_overflow_dont,
00302 bfd_elf_generic_reloc,
00303 "R_ARM_RREL32",
00304 FALSE,
00305 0,
00306 0,
00307 FALSE),
00308
00309 HOWTO (R_ARM_RABS32,
00310 0,
00311 0,
00312 0,
00313 FALSE,
00314 0,
00315 complain_overflow_dont,
00316 bfd_elf_generic_reloc,
00317 "R_ARM_RABS32",
00318 FALSE,
00319 0,
00320 0,
00321 FALSE),
00322
00323 HOWTO (R_ARM_RPC24,
00324 0,
00325 0,
00326 0,
00327 FALSE,
00328 0,
00329 complain_overflow_dont,
00330 bfd_elf_generic_reloc,
00331 "R_ARM_RPC24",
00332 FALSE,
00333 0,
00334 0,
00335 FALSE),
00336
00337 HOWTO (R_ARM_RBASE,
00338 0,
00339 0,
00340 0,
00341 FALSE,
00342 0,
00343 complain_overflow_dont,
00344 bfd_elf_generic_reloc,
00345 "R_ARM_RBASE",
00346 FALSE,
00347 0,
00348 0,
00349 FALSE)
00350 };
00351
00352
00353
00354
00355 static reloc_howto_type *
00356 find_howto (r_type)
00357 unsigned int r_type;
00358 {
00359 int i;
00360
00361 for (i = NUM_ELEM (elf32_arm_howto_table); i--;)
00362 if (elf32_arm_howto_table [i].type == r_type)
00363 return elf32_arm_howto_table + i;
00364
00365 return NULL;
00366 }
00367
00368 static void
00369 elf32_arm_info_to_howto (abfd, bfd_reloc, elf_reloc)
00370 bfd *abfd ATTRIBUTE_UNUSED;
00371 arelent *bfd_reloc;
00372 Elf_Internal_Rela *elf_reloc;
00373 {
00374 unsigned int r_type;
00375
00376 r_type = ELF32_R_TYPE (elf_reloc->r_info);
00377
00378 if (r_type <= R_ARM_GNU_VTINHERIT)
00379 bfd_reloc->howto = & elf32_arm_howto_table[r_type];
00380 else
00381 bfd_reloc->howto = find_howto (r_type);
00382 }
00383
00384 struct elf32_arm_reloc_map
00385 {
00386 bfd_reloc_code_real_type bfd_reloc_val;
00387 unsigned char elf_reloc_val;
00388 };
00389
00390 static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
00391 {
00392 {BFD_RELOC_NONE, R_ARM_NONE },
00393 {BFD_RELOC_ARM_PCREL_BRANCH, R_ARM_PC24 },
00394 {BFD_RELOC_32, R_ARM_ABS32 },
00395 {BFD_RELOC_32_PCREL, R_ARM_REL32 },
00396 {BFD_RELOC_8, R_ARM_ABS8 },
00397 {BFD_RELOC_16, R_ARM_ABS16 },
00398 {BFD_RELOC_ARM_OFFSET_IMM, R_ARM_ABS12 },
00399 {BFD_RELOC_ARM_THUMB_OFFSET, R_ARM_THM_ABS5 },
00400 {BFD_RELOC_THUMB_PCREL_BRANCH23, R_ARM_THM_PC22 },
00401 {BFD_RELOC_NONE, R_ARM_SBREL32 },
00402 {BFD_RELOC_NONE, R_ARM_AMP_VCALL9 },
00403 {BFD_RELOC_THUMB_PCREL_BRANCH12, R_ARM_THM_PC11 },
00404 {BFD_RELOC_THUMB_PCREL_BRANCH9, R_ARM_THM_PC9 },
00405 {BFD_RELOC_VTABLE_INHERIT, R_ARM_GNU_VTINHERIT },
00406 {BFD_RELOC_VTABLE_ENTRY, R_ARM_GNU_VTENTRY }
00407 };
00408
00409 static reloc_howto_type *
00410 elf32_arm_reloc_type_lookup (abfd, code)
00411 bfd * abfd ATTRIBUTE_UNUSED;
00412 bfd_reloc_code_real_type code;
00413 {
00414 unsigned int i;
00415
00416 for (i = NUM_ELEM (elf32_arm_reloc_map); i--;)
00417 if (elf32_arm_reloc_map[i].bfd_reloc_val == code)
00418 return & elf32_arm_howto_table [elf32_arm_reloc_map[i].elf_reloc_val];
00419
00420 if (code == BFD_RELOC_ARM_PLT32)
00421 return find_howto (R_ARM_PLT32);
00422
00423 return NULL;
00424 }
00425
00426 #include "elf32-arm.h"