OLD | NEW |
1 /* 32-bit ELF support for S+core. | 1 /* 32-bit ELF support for S+core. |
2 Copyright 2006, 2007, 2008, 2009, 2010, 2011 | 2 Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
3 Free Software Foundation, Inc. | 3 Free Software Foundation, Inc. |
4 Contributed by | 4 Contributed by |
5 Brain.lin (brain.lin@sunplusct.com) | 5 Brain.lin (brain.lin@sunplusct.com) |
6 Mei Ligang (ligang@sunnorth.com.cn) | 6 Mei Ligang (ligang@sunnorth.com.cn) |
7 Pei-Lin Tsai (pltsai@sunplus.com) | 7 Pei-Lin Tsai (pltsai@sunplus.com) |
8 | 8 |
9 This file is part of BFD, the Binary File Descriptor library. | 9 This file is part of BFD, the Binary File Descriptor library. |
10 | 10 |
11 This program is free software; you can redistribute it and/or modify | 11 This program is free software; you can redistribute it and/or modify |
12 it under the terms of the GNU General Public License as published by | 12 it under the terms of the GNU General Public License as published by |
(...skipping 1046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1059 h->root.dynindx = --hsd->min_got_dynindx; | 1059 h->root.dynindx = --hsd->min_got_dynindx; |
1060 hsd->low = (struct elf_link_hash_entry *) h; | 1060 hsd->low = (struct elf_link_hash_entry *) h; |
1061 } | 1061 } |
1062 | 1062 |
1063 return TRUE; | 1063 return TRUE; |
1064 } | 1064 } |
1065 | 1065 |
1066 static asection * | 1066 static asection * |
1067 score_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded) | 1067 score_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded) |
1068 { | 1068 { |
1069 asection *sgot = bfd_get_section_by_name (abfd, ".got"); | 1069 asection *sgot = bfd_get_linker_section (abfd, ".got"); |
1070 | 1070 |
1071 if (sgot == NULL || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0)) | 1071 if (sgot == NULL || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0)) |
1072 return NULL; | 1072 return NULL; |
1073 return sgot; | 1073 return sgot; |
1074 } | 1074 } |
1075 | 1075 |
1076 /* Returns the GOT information associated with the link indicated by | 1076 /* Returns the GOT information associated with the link indicated by |
1077 INFO. If SGOTP is non-NULL, it is filled in with the GOT section. */ | 1077 INFO. If SGOTP is non-NULL, it is filled in with the GOT section. */ |
1078 static struct score_got_info * | 1078 static struct score_got_info * |
1079 score_elf_got_info (bfd *abfd, asection **sgotp) | 1079 score_elf_got_info (bfd *abfd, asection **sgotp) |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1240 return FALSE; | 1240 return FALSE; |
1241 } | 1241 } |
1242 | 1242 |
1243 /* Returns the dynamic relocation section for DYNOBJ. */ | 1243 /* Returns the dynamic relocation section for DYNOBJ. */ |
1244 static asection * | 1244 static asection * |
1245 score_elf_rel_dyn_section (bfd *dynobj, bfd_boolean create_p) | 1245 score_elf_rel_dyn_section (bfd *dynobj, bfd_boolean create_p) |
1246 { | 1246 { |
1247 static const char dname[] = ".rel.dyn"; | 1247 static const char dname[] = ".rel.dyn"; |
1248 asection *sreloc; | 1248 asection *sreloc; |
1249 | 1249 |
1250 sreloc = bfd_get_section_by_name (dynobj, dname); | 1250 sreloc = bfd_get_linker_section (dynobj, dname); |
1251 if (sreloc == NULL && create_p) | 1251 if (sreloc == NULL && create_p) |
1252 { | 1252 { |
1253 sreloc = bfd_make_section_with_flags (dynobj, dname, | 1253 sreloc = bfd_make_section_anyway_with_flags (dynobj, dname, |
1254 (SEC_ALLOC | 1254 » » » » » » (SEC_ALLOC |
1255 | SEC_LOAD | 1255 » » » » » » | SEC_LOAD |
1256 | SEC_HAS_CONTENTS | 1256 » » » » » » | SEC_HAS_CONTENTS |
1257 | SEC_IN_MEMORY | 1257 » » » » » » | SEC_IN_MEMORY |
1258 | SEC_LINKER_CREATED | 1258 » » » » » » | SEC_LINKER_CREATED |
1259 | SEC_READONLY)); | 1259 » » » » » » | SEC_READONLY)); |
1260 if (sreloc == NULL | 1260 if (sreloc == NULL |
1261 || ! bfd_set_section_alignment (dynobj, sreloc, | 1261 || ! bfd_set_section_alignment (dynobj, sreloc, |
1262 SCORE_ELF_LOG_FILE_ALIGN (dynobj))) | 1262 SCORE_ELF_LOG_FILE_ALIGN (dynobj))) |
1263 return NULL; | 1263 return NULL; |
1264 } | 1264 } |
1265 return sreloc; | 1265 return sreloc; |
1266 } | 1266 } |
1267 | 1267 |
1268 static void | 1268 static void |
1269 score_elf_allocate_dynamic_relocations (bfd *abfd, unsigned int n) | 1269 score_elf_allocate_dynamic_relocations (bfd *abfd, unsigned int n) |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1422 return TRUE; | 1422 return TRUE; |
1423 } | 1423 } |
1424 | 1424 |
1425 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_
CREATED); | 1425 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_
CREATED); |
1426 | 1426 |
1427 if (maybe_exclude) | 1427 if (maybe_exclude) |
1428 flags |= SEC_EXCLUDE; | 1428 flags |= SEC_EXCLUDE; |
1429 | 1429 |
1430 /* We have to use an alignment of 2**4 here because this is hardcoded | 1430 /* We have to use an alignment of 2**4 here because this is hardcoded |
1431 in the function stub generation and in the linker script. */ | 1431 in the function stub generation and in the linker script. */ |
1432 s = bfd_make_section_with_flags (abfd, ".got", flags); | 1432 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); |
1433 if (s == NULL | 1433 if (s == NULL |
1434 || ! bfd_set_section_alignment (abfd, s, 4)) | 1434 || ! bfd_set_section_alignment (abfd, s, 4)) |
1435 return FALSE; | 1435 return FALSE; |
1436 | 1436 |
1437 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the | 1437 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the |
1438 linker script because we don't want to define the symbol if we | 1438 linker script because we don't want to define the symbol if we |
1439 are not creating a global offset table. */ | 1439 are not creating a global offset table. */ |
1440 bh = NULL; | 1440 bh = NULL; |
1441 if (! (_bfd_generic_link_add_one_symbol | 1441 if (! (_bfd_generic_link_add_one_symbol |
1442 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, | 1442 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2665 if (! ((*info->callbacks->undefined_symbol) | 2665 if (! ((*info->callbacks->undefined_symbol) |
2666 (info, h->root.root.root.string, input_bfd, | 2666 (info, h->root.root.root.string, input_bfd, |
2667 input_section, rel->r_offset, | 2667 input_section, rel->r_offset, |
2668 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR) | 2668 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR) |
2669 || ELF_ST_VISIBILITY (h->root.other)))) | 2669 || ELF_ST_VISIBILITY (h->root.other)))) |
2670 return bfd_reloc_undefined; | 2670 return bfd_reloc_undefined; |
2671 relocation = 0; | 2671 relocation = 0; |
2672 } | 2672 } |
2673 } | 2673 } |
2674 | 2674 |
2675 if (sec != NULL && elf_discarded_section (sec)) | 2675 if (sec != NULL && discarded_section (sec)) |
2676 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, | 2676 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, |
2677 » » » » » rel, relend, howto, contents); | 2677 » » » » » rel, 1, relend, howto, 0, contents); |
2678 | 2678 |
2679 if (info->relocatable) | 2679 if (info->relocatable) |
2680 { | 2680 { |
2681 /* This is a relocatable link. We don't have to change | 2681 /* This is a relocatable link. We don't have to change |
2682 anything, unless the reloc is against a section symbol, | 2682 anything, unless the reloc is against a section symbol, |
2683 in which case we have to adjust according to where the | 2683 in which case we have to adjust according to where the |
2684 section symbol winds up in the output section. */ | 2684 section symbol winds up in the output section. */ |
2685 if (r_symndx < symtab_hdr->sh_info) | 2685 if (r_symndx < symtab_hdr->sh_info) |
2686 { | 2686 { |
2687 sym = local_syms + r_symndx; | 2687 sym = local_syms + r_symndx; |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3116 if (!elf_hash_table (info)->dynamic_sections_created) | 3116 if (!elf_hash_table (info)->dynamic_sections_created) |
3117 return TRUE; | 3117 return TRUE; |
3118 | 3118 |
3119 /* If this symbol is not defined in a regular file, then set | 3119 /* If this symbol is not defined in a regular file, then set |
3120 the symbol to the stub location. This is required to make | 3120 the symbol to the stub location. This is required to make |
3121 function pointers compare as equal between the normal | 3121 function pointers compare as equal between the normal |
3122 executable and the shared library. */ | 3122 executable and the shared library. */ |
3123 if (!h->def_regular) | 3123 if (!h->def_regular) |
3124 { | 3124 { |
3125 /* We need .stub section. */ | 3125 /* We need .stub section. */ |
3126 s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME); | 3126 s = bfd_get_linker_section (dynobj, SCORE_ELF_STUB_SECTION_NAME); |
3127 BFD_ASSERT (s != NULL); | 3127 BFD_ASSERT (s != NULL); |
3128 | 3128 |
3129 h->root.u.def.section = s; | 3129 h->root.u.def.section = s; |
3130 h->root.u.def.value = s->size; | 3130 h->root.u.def.value = s->size; |
3131 | 3131 |
3132 /* XXX Write this stub address somewhere. */ | 3132 /* XXX Write this stub address somewhere. */ |
3133 h->plt.offset = s->size; | 3133 h->plt.offset = s->size; |
3134 | 3134 |
3135 /* Make room for this stub code. */ | 3135 /* Make room for this stub code. */ |
3136 s->size += SCORE_FUNCTION_STUB_SIZE; | 3136 s->size += SCORE_FUNCTION_STUB_SIZE; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3252 bfd_boolean reltext; | 3252 bfd_boolean reltext; |
3253 | 3253 |
3254 dynobj = elf_hash_table (info)->dynobj; | 3254 dynobj = elf_hash_table (info)->dynobj; |
3255 BFD_ASSERT (dynobj != NULL); | 3255 BFD_ASSERT (dynobj != NULL); |
3256 | 3256 |
3257 if (elf_hash_table (info)->dynamic_sections_created) | 3257 if (elf_hash_table (info)->dynamic_sections_created) |
3258 { | 3258 { |
3259 /* Set the contents of the .interp section to the interpreter. */ | 3259 /* Set the contents of the .interp section to the interpreter. */ |
3260 if (!info->shared) | 3260 if (!info->shared) |
3261 { | 3261 { |
3262 s = bfd_get_section_by_name (dynobj, ".interp"); | 3262 s = bfd_get_linker_section (dynobj, ".interp"); |
3263 BFD_ASSERT (s != NULL); | 3263 BFD_ASSERT (s != NULL); |
3264 s->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1; | 3264 s->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1; |
3265 s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER; | 3265 s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER; |
3266 } | 3266 } |
3267 } | 3267 } |
3268 | 3268 |
3269 /* The check_relocs and adjust_dynamic_symbol entry points have | 3269 /* The check_relocs and adjust_dynamic_symbol entry points have |
3270 determined the sizes of the various dynamic sections. Allocate | 3270 determined the sizes of the various dynamic sections. Allocate |
3271 memory for them. */ | 3271 memory for them. */ |
3272 reltext = FALSE; | 3272 reltext = FALSE; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3410 { | 3410 { |
3411 struct elf_link_hash_entry *h; | 3411 struct elf_link_hash_entry *h; |
3412 struct bfd_link_hash_entry *bh; | 3412 struct bfd_link_hash_entry *bh; |
3413 flagword flags; | 3413 flagword flags; |
3414 asection *s; | 3414 asection *s; |
3415 | 3415 |
3416 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | 3416 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY |
3417 | SEC_LINKER_CREATED | SEC_READONLY); | 3417 | SEC_LINKER_CREATED | SEC_READONLY); |
3418 | 3418 |
3419 /* ABI requests the .dynamic section to be read only. */ | 3419 /* ABI requests the .dynamic section to be read only. */ |
3420 s = bfd_get_section_by_name (abfd, ".dynamic"); | 3420 s = bfd_get_linker_section (abfd, ".dynamic"); |
3421 if (s != NULL) | 3421 if (s != NULL) |
3422 { | 3422 { |
3423 if (!bfd_set_section_flags (abfd, s, flags)) | 3423 if (!bfd_set_section_flags (abfd, s, flags)) |
3424 return FALSE; | 3424 return FALSE; |
3425 } | 3425 } |
3426 | 3426 |
3427 /* We need to create .got section. */ | 3427 /* We need to create .got section. */ |
3428 if (!score_elf_create_got_section (abfd, info, FALSE)) | 3428 if (!score_elf_create_got_section (abfd, info, FALSE)) |
3429 return FALSE; | 3429 return FALSE; |
3430 | 3430 |
3431 if (!score_elf_rel_dyn_section (elf_hash_table (info)->dynobj, TRUE)) | 3431 if (!score_elf_rel_dyn_section (elf_hash_table (info)->dynobj, TRUE)) |
3432 return FALSE; | 3432 return FALSE; |
3433 | 3433 |
3434 /* Create .stub section. */ | 3434 /* Create .stub section. */ |
3435 if (bfd_get_section_by_name (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL) | 3435 if (bfd_get_linker_section (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL) |
3436 { | 3436 { |
3437 s = bfd_make_section_with_flags (abfd, SCORE_ELF_STUB_SECTION_NAME, | 3437 s = bfd_make_section_anyway_with_flags (abfd, SCORE_ELF_STUB_SECTION_NAME, |
3438 flags | SEC_CODE); | 3438 » » » » » flags | SEC_CODE); |
3439 if (s == NULL | 3439 if (s == NULL |
3440 || !bfd_set_section_alignment (abfd, s, 2)) | 3440 || !bfd_set_section_alignment (abfd, s, 2)) |
3441 | 3441 |
3442 return FALSE; | 3442 return FALSE; |
3443 } | 3443 } |
3444 | 3444 |
3445 if (!info->shared) | 3445 if (!info->shared) |
3446 { | 3446 { |
3447 const char *name; | 3447 const char *name; |
3448 | 3448 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3482 dynobj = elf_hash_table (info)->dynobj; | 3482 dynobj = elf_hash_table (info)->dynobj; |
3483 | 3483 |
3484 if (h->plt.offset != MINUS_ONE) | 3484 if (h->plt.offset != MINUS_ONE) |
3485 { | 3485 { |
3486 asection *s; | 3486 asection *s; |
3487 bfd_byte stub[SCORE_FUNCTION_STUB_SIZE]; | 3487 bfd_byte stub[SCORE_FUNCTION_STUB_SIZE]; |
3488 | 3488 |
3489 /* This symbol has a stub. Set it up. */ | 3489 /* This symbol has a stub. Set it up. */ |
3490 BFD_ASSERT (h->dynindx != -1); | 3490 BFD_ASSERT (h->dynindx != -1); |
3491 | 3491 |
3492 s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME); | 3492 s = bfd_get_linker_section (dynobj, SCORE_ELF_STUB_SECTION_NAME); |
3493 BFD_ASSERT (s != NULL); | 3493 BFD_ASSERT (s != NULL); |
3494 | 3494 |
3495 /* FIXME: Can h->dynindex be more than 64K? */ | 3495 /* FIXME: Can h->dynindex be more than 64K? */ |
3496 if (h->dynindx & 0xffff0000) | 3496 if (h->dynindx & 0xffff0000) |
3497 return FALSE; | 3497 return FALSE; |
3498 | 3498 |
3499 /* Fill the stub. */ | 3499 /* Fill the stub. */ |
3500 score_bfd_put_32 (output_bfd, STUB_LW, stub); | 3500 score_bfd_put_32 (output_bfd, STUB_LW, stub); |
3501 score_bfd_put_32 (output_bfd, STUB_MOVE, stub + 4); | 3501 score_bfd_put_32 (output_bfd, STUB_MOVE, stub + 4); |
3502 score_bfd_put_32 (output_bfd, STUB_LI16 | (h->dynindx << 1), stub + 8); | 3502 score_bfd_put_32 (output_bfd, STUB_LI16 | (h->dynindx << 1), stub + 8); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3561 struct bfd_link_info *info) | 3561 struct bfd_link_info *info) |
3562 { | 3562 { |
3563 bfd *dynobj; | 3563 bfd *dynobj; |
3564 asection *sdyn; | 3564 asection *sdyn; |
3565 asection *sgot; | 3565 asection *sgot; |
3566 asection *s; | 3566 asection *s; |
3567 struct score_got_info *g; | 3567 struct score_got_info *g; |
3568 | 3568 |
3569 dynobj = elf_hash_table (info)->dynobj; | 3569 dynobj = elf_hash_table (info)->dynobj; |
3570 | 3570 |
3571 sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); | 3571 sdyn = bfd_get_linker_section (dynobj, ".dynamic"); |
3572 | 3572 |
3573 sgot = score_elf_got_section (dynobj, FALSE); | 3573 sgot = score_elf_got_section (dynobj, FALSE); |
3574 if (sgot == NULL) | 3574 if (sgot == NULL) |
3575 g = NULL; | 3575 g = NULL; |
3576 else | 3576 else |
3577 { | 3577 { |
3578 BFD_ASSERT (score_elf_section_data (sgot) != NULL); | 3578 BFD_ASSERT (score_elf_section_data (sgot) != NULL); |
3579 g = score_elf_section_data (sgot)->u.got_info; | 3579 g = score_elf_section_data (sgot)->u.got_info; |
3580 BFD_ASSERT (g != NULL); | 3580 BFD_ASSERT (g != NULL); |
3581 } | 3581 } |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4491 | 4491 |
4492 #define bfd_elf32_bfd_reloc_type_lookup elf32_score_reloc_type_lookup | 4492 #define bfd_elf32_bfd_reloc_type_lookup elf32_score_reloc_type_lookup |
4493 #define bfd_elf32_bfd_reloc_name_lookup \ | 4493 #define bfd_elf32_bfd_reloc_name_lookup \ |
4494 elf32_score_reloc_name_lookup | 4494 elf32_score_reloc_name_lookup |
4495 #define bfd_elf32_bfd_link_hash_table_create elf32_score_link_hash_table_create | 4495 #define bfd_elf32_bfd_link_hash_table_create elf32_score_link_hash_table_create |
4496 #define bfd_elf32_bfd_print_private_bfd_data elf32_score_print_private_bfd_data | 4496 #define bfd_elf32_bfd_print_private_bfd_data elf32_score_print_private_bfd_data |
4497 #define bfd_elf32_bfd_merge_private_bfd_data elf32_score_merge_private_bfd_data | 4497 #define bfd_elf32_bfd_merge_private_bfd_data elf32_score_merge_private_bfd_data |
4498 #define bfd_elf32_new_section_hook elf32_score_new_section_hook | 4498 #define bfd_elf32_new_section_hook elf32_score_new_section_hook |
4499 | 4499 |
4500 #include "elf32-target.h" | 4500 #include "elf32-target.h" |
OLD | NEW |