| OLD | NEW |
| 1 /* MMIX-specific support for 64-bit ELF. | 1 /* MMIX-specific support for 64-bit ELF. |
| 2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 | 2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, |
| 3 2012 |
| 3 Free Software Foundation, Inc. | 4 Free Software Foundation, Inc. |
| 4 Contributed by Hans-Peter Nilsson <hp@bitrange.com> | 5 Contributed by Hans-Peter Nilsson <hp@bitrange.com> |
| 5 | 6 |
| 6 This file is part of BFD, the Binary File Descriptor library. | 7 This file is part of BFD, the Binary File Descriptor library. |
| 7 | 8 |
| 8 This program is free software; you can redistribute it and/or modify | 9 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 10 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 11 the Free Software Foundation; either version 3 of the License, or |
| 11 (at your option) any later version. | 12 (at your option) any later version. |
| 12 | 13 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 | 160 |
| 160 /* Index into reloc_request[], sorted on increasing "value", secondary | 161 /* Index into reloc_request[], sorted on increasing "value", secondary |
| 161 by increasing index for strict sorting order. */ | 162 by increasing index for strict sorting order. */ |
| 162 size_t *bpo_reloc_indexes; | 163 size_t *bpo_reloc_indexes; |
| 163 | 164 |
| 164 /* An array of all relocations, with the "value" member filled in by | 165 /* An array of all relocations, with the "value" member filled in by |
| 165 the relaxation function. */ | 166 the relaxation function. */ |
| 166 struct bpo_reloc_request *reloc_request; | 167 struct bpo_reloc_request *reloc_request; |
| 167 }; | 168 }; |
| 168 | 169 |
| 169 static int mmix_elf_link_output_symbol_hook | |
| 170 PARAMS ((struct bfd_link_info *, const char *, Elf_Internal_Sym *, | |
| 171 asection *, struct elf_link_hash_entry *)); | |
| 172 | 170 |
| 173 static bfd_reloc_status_type mmix_elf_reloc | 171 extern bfd_boolean mmix_elf_final_link (bfd *, struct bfd_link_info *); |
| 174 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); | |
| 175 | 172 |
| 176 static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup | 173 extern void mmix_elf_symbol_processing (bfd *, asymbol *); |
| 177 PARAMS ((bfd *, bfd_reloc_code_real_type)); | |
| 178 | |
| 179 static void mmix_info_to_howto_rela | |
| 180 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); | |
| 181 | |
| 182 static int mmix_elf_sort_relocs PARAMS ((const PTR, const PTR)); | |
| 183 | |
| 184 static bfd_boolean mmix_elf_new_section_hook | |
| 185 PARAMS ((bfd *, asection *)); | |
| 186 | |
| 187 static bfd_boolean mmix_elf_check_relocs | |
| 188 PARAMS ((bfd *, struct bfd_link_info *, asection *, | |
| 189 » const Elf_Internal_Rela *)); | |
| 190 | |
| 191 static bfd_boolean mmix_elf_check_common_relocs | |
| 192 PARAMS ((bfd *, struct bfd_link_info *, asection *, | |
| 193 » const Elf_Internal_Rela *)); | |
| 194 | |
| 195 static bfd_boolean mmix_elf_relocate_section | |
| 196 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, | |
| 197 » Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); | |
| 198 | |
| 199 static bfd_reloc_status_type mmix_final_link_relocate | |
| 200 (reloc_howto_type *, asection *, bfd_byte *, bfd_vma, bfd_signed_vma, | |
| 201 bfd_vma, const char *, asection *, char **); | |
| 202 | |
| 203 static bfd_reloc_status_type mmix_elf_perform_relocation | |
| 204 (asection *, reloc_howto_type *, void *, bfd_vma, bfd_vma, char **); | |
| 205 | |
| 206 static bfd_boolean mmix_elf_section_from_bfd_section | |
| 207 PARAMS ((bfd *, asection *, int *)); | |
| 208 | |
| 209 static bfd_boolean mmix_elf_add_symbol_hook | |
| 210 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Sym *, | |
| 211 » const char **, flagword *, asection **, bfd_vma *)); | |
| 212 | |
| 213 static bfd_boolean mmix_elf_is_local_label_name | |
| 214 PARAMS ((bfd *, const char *)); | |
| 215 | |
| 216 static int bpo_reloc_request_sort_fn PARAMS ((const PTR, const PTR)); | |
| 217 | |
| 218 static bfd_boolean mmix_elf_relax_section | |
| 219 PARAMS ((bfd *abfd, asection *sec, struct bfd_link_info *link_info, | |
| 220 » bfd_boolean *again)); | |
| 221 | |
| 222 extern bfd_boolean mmix_elf_final_link PARAMS ((bfd *, struct bfd_link_info *)); | |
| 223 | |
| 224 extern void mmix_elf_symbol_processing PARAMS ((bfd *, asymbol *)); | |
| 225 | 174 |
| 226 /* Only intended to be called from a debugger. */ | 175 /* Only intended to be called from a debugger. */ |
| 227 extern void mmix_dump_bpo_gregs | 176 extern void mmix_dump_bpo_gregs |
| 228 PARAMS ((struct bfd_link_info *, bfd_error_handler_type)); | 177 (struct bfd_link_info *, bfd_error_handler_type); |
| 229 | 178 |
| 230 static void | 179 static void |
| 231 mmix_set_relaxable_size | 180 mmix_set_relaxable_size (bfd *, asection *, void *); |
| 232 PARAMS ((bfd *, asection *, void *)); | 181 static bfd_reloc_status_type |
| 182 mmix_elf_reloc (bfd *, arelent *, asymbol *, void *, |
| 183 » » asection *, bfd *, char **); |
| 184 static bfd_reloc_status_type |
| 185 mmix_final_link_relocate (reloc_howto_type *, asection *, bfd_byte *, bfd_vma, |
| 186 » » » bfd_signed_vma, bfd_vma, const char *, asection *, |
| 187 » » » char **); |
| 233 | 188 |
| 234 | 189 |
| 235 /* Watch out: this currently needs to have elements with the same index as | 190 /* Watch out: this currently needs to have elements with the same index as |
| 236 their R_MMIX_ number. */ | 191 their R_MMIX_ number. */ |
| 237 static reloc_howto_type elf_mmix_howto_table[] = | 192 static reloc_howto_type elf_mmix_howto_table[] = |
| 238 { | 193 { |
| 239 /* This reloc does nothing. */ | 194 /* This reloc does nothing. */ |
| 240 HOWTO (R_MMIX_NONE, /* type */ | 195 HOWTO (R_MMIX_NONE, /* type */ |
| 241 0, /* rightshift */ | 196 0, /* rightshift */ |
| 242 2, /* size (0 = byte, 1 = short, 2 = long) */ | 197 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 {BFD_RELOC_MMIX_ADDR19, R_MMIX_ADDR19}, | 788 {BFD_RELOC_MMIX_ADDR19, R_MMIX_ADDR19}, |
| 834 {BFD_RELOC_MMIX_ADDR27, R_MMIX_ADDR27}, | 789 {BFD_RELOC_MMIX_ADDR27, R_MMIX_ADDR27}, |
| 835 {BFD_RELOC_MMIX_REG_OR_BYTE, R_MMIX_REG_OR_BYTE}, | 790 {BFD_RELOC_MMIX_REG_OR_BYTE, R_MMIX_REG_OR_BYTE}, |
| 836 {BFD_RELOC_MMIX_REG, R_MMIX_REG}, | 791 {BFD_RELOC_MMIX_REG, R_MMIX_REG}, |
| 837 {BFD_RELOC_MMIX_BASE_PLUS_OFFSET, R_MMIX_BASE_PLUS_OFFSET}, | 792 {BFD_RELOC_MMIX_BASE_PLUS_OFFSET, R_MMIX_BASE_PLUS_OFFSET}, |
| 838 {BFD_RELOC_MMIX_LOCAL, R_MMIX_LOCAL}, | 793 {BFD_RELOC_MMIX_LOCAL, R_MMIX_LOCAL}, |
| 839 {BFD_RELOC_MMIX_PUSHJ_STUBBABLE, R_MMIX_PUSHJ_STUBBABLE} | 794 {BFD_RELOC_MMIX_PUSHJ_STUBBABLE, R_MMIX_PUSHJ_STUBBABLE} |
| 840 }; | 795 }; |
| 841 | 796 |
| 842 static reloc_howto_type * | 797 static reloc_howto_type * |
| 843 bfd_elf64_bfd_reloc_type_lookup (abfd, code) | 798 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, |
| 844 bfd *abfd ATTRIBUTE_UNUSED; | 799 » » » » bfd_reloc_code_real_type code) |
| 845 bfd_reloc_code_real_type code; | |
| 846 { | 800 { |
| 847 unsigned int i; | 801 unsigned int i; |
| 848 | 802 |
| 849 for (i = 0; | 803 for (i = 0; |
| 850 i < sizeof (mmix_reloc_map) / sizeof (mmix_reloc_map[0]); | 804 i < sizeof (mmix_reloc_map) / sizeof (mmix_reloc_map[0]); |
| 851 i++) | 805 i++) |
| 852 { | 806 { |
| 853 if (mmix_reloc_map[i].bfd_reloc_val == code) | 807 if (mmix_reloc_map[i].bfd_reloc_val == code) |
| 854 return &elf_mmix_howto_table[mmix_reloc_map[i].elf_reloc_val]; | 808 return &elf_mmix_howto_table[mmix_reloc_map[i].elf_reloc_val]; |
| 855 } | 809 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 867 i < sizeof (elf_mmix_howto_table) / sizeof (elf_mmix_howto_table[0]); | 821 i < sizeof (elf_mmix_howto_table) / sizeof (elf_mmix_howto_table[0]); |
| 868 i++) | 822 i++) |
| 869 if (elf_mmix_howto_table[i].name != NULL | 823 if (elf_mmix_howto_table[i].name != NULL |
| 870 && strcasecmp (elf_mmix_howto_table[i].name, r_name) == 0) | 824 && strcasecmp (elf_mmix_howto_table[i].name, r_name) == 0) |
| 871 return &elf_mmix_howto_table[i]; | 825 return &elf_mmix_howto_table[i]; |
| 872 | 826 |
| 873 return NULL; | 827 return NULL; |
| 874 } | 828 } |
| 875 | 829 |
| 876 static bfd_boolean | 830 static bfd_boolean |
| 877 mmix_elf_new_section_hook (abfd, sec) | 831 mmix_elf_new_section_hook (bfd *abfd, asection *sec) |
| 878 bfd *abfd; | |
| 879 asection *sec; | |
| 880 { | 832 { |
| 881 if (!sec->used_by_bfd) | 833 if (!sec->used_by_bfd) |
| 882 { | 834 { |
| 883 struct _mmix_elf_section_data *sdata; | 835 struct _mmix_elf_section_data *sdata; |
| 884 bfd_size_type amt = sizeof (*sdata); | 836 bfd_size_type amt = sizeof (*sdata); |
| 885 | 837 |
| 886 sdata = bfd_zalloc (abfd, amt); | 838 sdata = bfd_zalloc (abfd, amt); |
| 887 if (sdata == NULL) | 839 if (sdata == NULL) |
| 888 return FALSE; | 840 return FALSE; |
| 889 sec->used_by_bfd = sdata; | 841 sec->used_by_bfd = sdata; |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1295 bfd_put_32 (abfd, | 1247 bfd_put_32 (abfd, |
| 1296 (INCH_INSN_BYTE << 24) | ((value >> 48) & 0xffff) | (reg << 16), | 1248 (INCH_INSN_BYTE << 24) | ((value >> 48) & 0xffff) | (reg << 16), |
| 1297 (bfd_byte *) datap + offs + 12); | 1249 (bfd_byte *) datap + offs + 12); |
| 1298 | 1250 |
| 1299 return flag; | 1251 return flag; |
| 1300 } | 1252 } |
| 1301 | 1253 |
| 1302 /* Set the howto pointer for an MMIX ELF reloc (type RELA). */ | 1254 /* Set the howto pointer for an MMIX ELF reloc (type RELA). */ |
| 1303 | 1255 |
| 1304 static void | 1256 static void |
| 1305 mmix_info_to_howto_rela (abfd, cache_ptr, dst) | 1257 mmix_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, |
| 1306 bfd *abfd ATTRIBUTE_UNUSED; | 1258 » » » arelent *cache_ptr, |
| 1307 arelent *cache_ptr; | 1259 » » » Elf_Internal_Rela *dst) |
| 1308 Elf_Internal_Rela *dst; | |
| 1309 { | 1260 { |
| 1310 unsigned int r_type; | 1261 unsigned int r_type; |
| 1311 | 1262 |
| 1312 r_type = ELF64_R_TYPE (dst->r_info); | 1263 r_type = ELF64_R_TYPE (dst->r_info); |
| 1313 BFD_ASSERT (r_type < (unsigned int) R_MMIX_max); | 1264 BFD_ASSERT (r_type < (unsigned int) R_MMIX_max); |
| 1314 cache_ptr->howto = &elf_mmix_howto_table[r_type]; | 1265 cache_ptr->howto = &elf_mmix_howto_table[r_type]; |
| 1315 } | 1266 } |
| 1316 | 1267 |
| 1317 /* Any MMIX-specific relocation gets here at assembly time or when linking | 1268 /* Any MMIX-specific relocation gets here at assembly time or when linking |
| 1318 to other formats (such as mmo); this is the relocation function from | 1269 to other formats (such as mmo); this is the relocation function from |
| 1319 the reloc_table. We don't get here for final pure ELF linking. */ | 1270 the reloc_table. We don't get here for final pure ELF linking. */ |
| 1320 | 1271 |
| 1321 static bfd_reloc_status_type | 1272 static bfd_reloc_status_type |
| 1322 mmix_elf_reloc (abfd, reloc_entry, symbol, data, input_section, | 1273 mmix_elf_reloc (bfd *abfd, |
| 1323 » » output_bfd, error_message) | 1274 » » arelent *reloc_entry, |
| 1324 bfd *abfd; | 1275 » » asymbol *symbol, |
| 1325 arelent *reloc_entry; | 1276 » » void * data, |
| 1326 asymbol *symbol; | 1277 » » asection *input_section, |
| 1327 PTR data; | 1278 » » bfd *output_bfd, |
| 1328 asection *input_section; | 1279 » » char **error_message) |
| 1329 bfd *output_bfd; | |
| 1330 char **error_message; | |
| 1331 { | 1280 { |
| 1332 bfd_vma relocation; | 1281 bfd_vma relocation; |
| 1333 bfd_reloc_status_type r; | 1282 bfd_reloc_status_type r; |
| 1334 asection *reloc_target_output_section; | 1283 asection *reloc_target_output_section; |
| 1335 bfd_reloc_status_type flag = bfd_reloc_ok; | 1284 bfd_reloc_status_type flag = bfd_reloc_ok; |
| 1336 bfd_vma output_base = 0; | 1285 bfd_vma output_base = 0; |
| 1337 | 1286 |
| 1338 r = bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, | 1287 r = bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, |
| 1339 input_section, output_bfd, error_message); | 1288 input_section, output_bfd, error_message); |
| 1340 | 1289 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 | 1336 |
| 1388 return mmix_final_link_relocate (reloc_entry->howto, input_section, | 1337 return mmix_final_link_relocate (reloc_entry->howto, input_section, |
| 1389 data, reloc_entry->address, | 1338 data, reloc_entry->address, |
| 1390 reloc_entry->addend, relocation, | 1339 reloc_entry->addend, relocation, |
| 1391 bfd_asymbol_name (symbol), | 1340 bfd_asymbol_name (symbol), |
| 1392 reloc_target_output_section, | 1341 reloc_target_output_section, |
| 1393 error_message); | 1342 error_message); |
| 1394 } | 1343 } |
| 1395 | 1344 |
| 1396 | 1345 |
error: old chunk mismatch |
None
| OLD | NEW |