Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(479)

Side by Side Diff: bfd/elf32-score7.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « bfd/elf32-score.c ('k') | bfd/elf32-sh.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 32-bit ELF support for S+core. 1 /* 32-bit ELF support for S+core.
2 Copyright 2009, 2010, 2011 Free Software Foundation, Inc. 2 Copyright 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
3 Contributed by 3 Contributed by
4 Brain.lin (brain.lin@sunplusct.com) 4 Brain.lin (brain.lin@sunplusct.com)
5 Mei Ligang (ligang@sunnorth.com.cn) 5 Mei Ligang (ligang@sunnorth.com.cn)
6 Pei-Lin Tsai (pltsai@sunplus.com) 6 Pei-Lin Tsai (pltsai@sunplus.com)
7 7
8 This file is part of BFD, the Binary File Descriptor library. 8 This file is part of BFD, the Binary File Descriptor library.
9 9
10 This program is free software; you can redistribute it and/or modify 10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by 11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or 12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version. 13 (at your option) any later version.
14 14
15 This program is distributed in the hope that it will be useful, 15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details. 18 GNU General Public License for more details.
19 19
20 You should have received a copy of the GNU General Public License 20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software 21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */ 23 MA 02110-1301, USA. */
24 24
25 #include "sysdep.h"
25 #include "bfd.h" 26 #include "bfd.h"
26 #include "sysdep.h"
27 #include "libbfd.h" 27 #include "libbfd.h"
28 #include "libiberty.h" 28 #include "libiberty.h"
29 #include "elf-bfd.h" 29 #include "elf-bfd.h"
30 #include "elf/score.h" 30 #include "elf/score.h"
31 #include "elf/common.h" 31 #include "elf/common.h"
32 #include "elf/internal.h" 32 #include "elf/internal.h"
33 #include "hashtab.h" 33 #include "hashtab.h"
34 #include "elf32-score.h" 34 #include "elf32-score.h"
35 35
36 36
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 h->root.dynindx = --hsd->min_got_dynindx; 941 h->root.dynindx = --hsd->min_got_dynindx;
942 hsd->low = (struct elf_link_hash_entry *) h; 942 hsd->low = (struct elf_link_hash_entry *) h;
943 } 943 }
944 944
945 return TRUE; 945 return TRUE;
946 } 946 }
947 947
948 static asection * 948 static asection *
949 score_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded) 949 score_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded)
950 { 950 {
951 asection *sgot = bfd_get_section_by_name (abfd, ".got"); 951 asection *sgot = bfd_get_linker_section (abfd, ".got");
952 952
953 if (sgot == NULL || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0)) 953 if (sgot == NULL || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0))
954 return NULL; 954 return NULL;
955 return sgot; 955 return sgot;
956 } 956 }
957 957
958 /* Returns the GOT information associated with the link indicated by 958 /* Returns the GOT information associated with the link indicated by
959 INFO. If SGOTP is non-NULL, it is filled in with the GOT section. */ 959 INFO. If SGOTP is non-NULL, it is filled in with the GOT section. */
960 960
961 static struct score_got_info * 961 static struct score_got_info *
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 } 1096 }
1097 1097
1098 /* Returns the dynamic relocation section for DYNOBJ. */ 1098 /* Returns the dynamic relocation section for DYNOBJ. */
1099 1099
1100 static asection * 1100 static asection *
1101 score_elf_rel_dyn_section (bfd *dynobj, bfd_boolean create_p) 1101 score_elf_rel_dyn_section (bfd *dynobj, bfd_boolean create_p)
1102 { 1102 {
1103 static const char dname[] = ".rel.dyn"; 1103 static const char dname[] = ".rel.dyn";
1104 asection *sreloc; 1104 asection *sreloc;
1105 1105
1106 sreloc = bfd_get_section_by_name (dynobj, dname); 1106 sreloc = bfd_get_linker_section (dynobj, dname);
1107 if (sreloc == NULL && create_p) 1107 if (sreloc == NULL && create_p)
1108 { 1108 {
1109 sreloc = bfd_make_section_with_flags (dynobj, dname, 1109 sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
1110 (SEC_ALLOC 1110 » » » » » » (SEC_ALLOC
1111 | SEC_LOAD 1111 » » » » » » | SEC_LOAD
1112 | SEC_HAS_CONTENTS 1112 » » » » » » | SEC_HAS_CONTENTS
1113 | SEC_IN_MEMORY 1113 » » » » » » | SEC_IN_MEMORY
1114 | SEC_LINKER_CREATED 1114 » » » » » » | SEC_LINKER_CREATED
1115 | SEC_READONLY)); 1115 » » » » » » | SEC_READONLY));
1116 if (sreloc == NULL 1116 if (sreloc == NULL
1117 || ! bfd_set_section_alignment (dynobj, sreloc, 1117 || ! bfd_set_section_alignment (dynobj, sreloc,
1118 SCORE_ELF_LOG_FILE_ALIGN (dynobj))) 1118 SCORE_ELF_LOG_FILE_ALIGN (dynobj)))
1119 return NULL; 1119 return NULL;
1120 } 1120 }
1121 return sreloc; 1121 return sreloc;
1122 } 1122 }
1123 1123
1124 static void 1124 static void
1125 score_elf_allocate_dynamic_relocations (bfd *abfd, unsigned int n) 1125 score_elf_allocate_dynamic_relocations (bfd *abfd, unsigned int n)
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 return TRUE; 1279 return TRUE;
1280 } 1280 }
1281 1281
1282 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_ CREATED); 1282 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_ CREATED);
1283 1283
1284 if (maybe_exclude) 1284 if (maybe_exclude)
1285 flags |= SEC_EXCLUDE; 1285 flags |= SEC_EXCLUDE;
1286 1286
1287 /* We have to use an alignment of 2**4 here because this is hardcoded 1287 /* We have to use an alignment of 2**4 here because this is hardcoded
1288 in the function stub generation and in the linker script. */ 1288 in the function stub generation and in the linker script. */
1289 s = bfd_make_section_with_flags (abfd, ".got", flags); 1289 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
1290 if (s == NULL 1290 if (s == NULL
1291 || ! bfd_set_section_alignment (abfd, s, 4)) 1291 || ! bfd_set_section_alignment (abfd, s, 4))
1292 return FALSE; 1292 return FALSE;
1293 1293
1294 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the 1294 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
1295 linker script because we don't want to define the symbol if we 1295 linker script because we don't want to define the symbol if we
1296 are not creating a global offset table. */ 1296 are not creating a global offset table. */
1297 bh = NULL; 1297 bh = NULL;
1298 if (! (_bfd_generic_link_add_one_symbol 1298 if (! (_bfd_generic_link_add_one_symbol
1299 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, 1299 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
2436 if (! ((*info->callbacks->undefined_symbol) 2436 if (! ((*info->callbacks->undefined_symbol)
2437 (info, h->root.root.root.string, input_bfd, 2437 (info, h->root.root.root.string, input_bfd,
2438 input_section, rel->r_offset, 2438 input_section, rel->r_offset,
2439 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR) 2439 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
2440 || ELF_ST_VISIBILITY (h->root.other)))) 2440 || ELF_ST_VISIBILITY (h->root.other))))
2441 return bfd_reloc_undefined; 2441 return bfd_reloc_undefined;
2442 relocation = 0; 2442 relocation = 0;
2443 } 2443 }
2444 } 2444 }
2445 2445
2446 if (sec != NULL && elf_discarded_section (sec)) 2446 if (sec != NULL && discarded_section (sec))
2447 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 2447 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2448 » » » » » rel, relend, howto, contents); 2448 » » » » » rel, 1, relend, howto, 0, contents);
2449 2449
2450 if (info->relocatable) 2450 if (info->relocatable)
2451 { 2451 {
2452 /* This is a relocatable link. We don't have to change 2452 /* This is a relocatable link. We don't have to change
2453 anything, unless the reloc is against a section symbol, 2453 anything, unless the reloc is against a section symbol,
2454 in which case we have to adjust according to where the 2454 in which case we have to adjust according to where the
2455 section symbol winds up in the output section. */ 2455 section symbol winds up in the output section. */
2456 if (r_symndx < symtab_hdr->sh_info) 2456 if (r_symndx < symtab_hdr->sh_info)
2457 { 2457 {
2458 sym = local_syms + r_symndx; 2458 sym = local_syms + r_symndx;
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
2921 if (!elf_hash_table (info)->dynamic_sections_created) 2921 if (!elf_hash_table (info)->dynamic_sections_created)
2922 return TRUE; 2922 return TRUE;
2923 2923
2924 /* If this symbol is not defined in a regular file, then set 2924 /* If this symbol is not defined in a regular file, then set
2925 the symbol to the stub location. This is required to make 2925 the symbol to the stub location. This is required to make
2926 function pointers compare as equal between the normal 2926 function pointers compare as equal between the normal
2927 executable and the shared library. */ 2927 executable and the shared library. */
2928 if (!h->def_regular) 2928 if (!h->def_regular)
2929 { 2929 {
2930 /* We need .stub section. */ 2930 /* We need .stub section. */
2931 s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME); 2931 s = bfd_get_linker_section (dynobj, SCORE_ELF_STUB_SECTION_NAME);
2932 BFD_ASSERT (s != NULL); 2932 BFD_ASSERT (s != NULL);
2933 2933
2934 h->root.u.def.section = s; 2934 h->root.u.def.section = s;
2935 h->root.u.def.value = s->size; 2935 h->root.u.def.value = s->size;
2936 2936
2937 /* XXX Write this stub address somewhere. */ 2937 /* XXX Write this stub address somewhere. */
2938 h->plt.offset = s->size; 2938 h->plt.offset = s->size;
2939 2939
2940 /* Make room for this stub code. */ 2940 /* Make room for this stub code. */
2941 s->size += SCORE_FUNCTION_STUB_SIZE; 2941 s->size += SCORE_FUNCTION_STUB_SIZE;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3059 bfd_boolean reltext; 3059 bfd_boolean reltext;
3060 3060
3061 dynobj = elf_hash_table (info)->dynobj; 3061 dynobj = elf_hash_table (info)->dynobj;
3062 BFD_ASSERT (dynobj != NULL); 3062 BFD_ASSERT (dynobj != NULL);
3063 3063
3064 if (elf_hash_table (info)->dynamic_sections_created) 3064 if (elf_hash_table (info)->dynamic_sections_created)
3065 { 3065 {
3066 /* Set the contents of the .interp section to the interpreter. */ 3066 /* Set the contents of the .interp section to the interpreter. */
3067 if (!info->shared) 3067 if (!info->shared)
3068 { 3068 {
3069 s = bfd_get_section_by_name (dynobj, ".interp"); 3069 s = bfd_get_linker_section (dynobj, ".interp");
3070 BFD_ASSERT (s != NULL); 3070 BFD_ASSERT (s != NULL);
3071 s->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1; 3071 s->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1;
3072 s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER; 3072 s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
3073 } 3073 }
3074 } 3074 }
3075 3075
3076 /* The check_relocs and adjust_dynamic_symbol entry points have 3076 /* The check_relocs and adjust_dynamic_symbol entry points have
3077 determined the sizes of the various dynamic sections. Allocate 3077 determined the sizes of the various dynamic sections. Allocate
3078 memory for them. */ 3078 memory for them. */
3079 reltext = FALSE; 3079 reltext = FALSE;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
3217 { 3217 {
3218 struct elf_link_hash_entry *h; 3218 struct elf_link_hash_entry *h;
3219 struct bfd_link_hash_entry *bh; 3219 struct bfd_link_hash_entry *bh;
3220 flagword flags; 3220 flagword flags;
3221 asection *s; 3221 asection *s;
3222 3222
3223 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 3223 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3224 | SEC_LINKER_CREATED | SEC_READONLY); 3224 | SEC_LINKER_CREATED | SEC_READONLY);
3225 3225
3226 /* ABI requests the .dynamic section to be read only. */ 3226 /* ABI requests the .dynamic section to be read only. */
3227 s = bfd_get_section_by_name (abfd, ".dynamic"); 3227 s = bfd_get_linker_section (abfd, ".dynamic");
3228 if (s != NULL) 3228 if (s != NULL)
3229 { 3229 {
3230 if (!bfd_set_section_flags (abfd, s, flags)) 3230 if (!bfd_set_section_flags (abfd, s, flags))
3231 return FALSE; 3231 return FALSE;
3232 } 3232 }
3233 3233
3234 /* We need to create .got section. */ 3234 /* We need to create .got section. */
3235 if (!score_elf_create_got_section (abfd, info, FALSE)) 3235 if (!score_elf_create_got_section (abfd, info, FALSE))
3236 return FALSE; 3236 return FALSE;
3237 3237
3238 if (!score_elf_rel_dyn_section (elf_hash_table (info)->dynobj, TRUE)) 3238 if (!score_elf_rel_dyn_section (elf_hash_table (info)->dynobj, TRUE))
3239 return FALSE; 3239 return FALSE;
3240 3240
3241 /* Create .stub section. */ 3241 /* Create .stub section. */
3242 if (bfd_get_section_by_name (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL) 3242 if (bfd_get_linker_section (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL)
3243 { 3243 {
3244 s = bfd_make_section_with_flags (abfd, SCORE_ELF_STUB_SECTION_NAME, 3244 s = bfd_make_section_anyway_with_flags (abfd, SCORE_ELF_STUB_SECTION_NAME,
3245 flags | SEC_CODE); 3245 » » » » » flags | SEC_CODE);
3246 if (s == NULL 3246 if (s == NULL
3247 || !bfd_set_section_alignment (abfd, s, 2)) 3247 || !bfd_set_section_alignment (abfd, s, 2))
3248 3248
3249 return FALSE; 3249 return FALSE;
3250 } 3250 }
3251 3251
3252 if (!info->shared) 3252 if (!info->shared)
3253 { 3253 {
3254 const char *name; 3254 const char *name;
3255 3255
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3290 dynobj = elf_hash_table (info)->dynobj; 3290 dynobj = elf_hash_table (info)->dynobj;
3291 3291
3292 if (h->plt.offset != MINUS_ONE) 3292 if (h->plt.offset != MINUS_ONE)
3293 { 3293 {
3294 asection *s; 3294 asection *s;
3295 bfd_byte stub[SCORE_FUNCTION_STUB_SIZE]; 3295 bfd_byte stub[SCORE_FUNCTION_STUB_SIZE];
3296 3296
3297 /* This symbol has a stub. Set it up. */ 3297 /* This symbol has a stub. Set it up. */
3298 BFD_ASSERT (h->dynindx != -1); 3298 BFD_ASSERT (h->dynindx != -1);
3299 3299
3300 s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME); 3300 s = bfd_get_linker_section (dynobj, SCORE_ELF_STUB_SECTION_NAME);
3301 BFD_ASSERT (s != NULL); 3301 BFD_ASSERT (s != NULL);
3302 3302
3303 /* FIXME: Can h->dynindex be more than 64K? */ 3303 /* FIXME: Can h->dynindex be more than 64K? */
3304 if (h->dynindx & 0xffff0000) 3304 if (h->dynindx & 0xffff0000)
3305 return FALSE; 3305 return FALSE;
3306 3306
3307 /* Fill the stub. */ 3307 /* Fill the stub. */
3308 bfd_put_32 (output_bfd, STUB_LW, stub); 3308 bfd_put_32 (output_bfd, STUB_LW, stub);
3309 bfd_put_32 (output_bfd, STUB_MOVE, stub + 4); 3309 bfd_put_32 (output_bfd, STUB_MOVE, stub + 4);
3310 bfd_put_32 (output_bfd, STUB_LI16 | (h->dynindx << 1), stub + 8); 3310 bfd_put_32 (output_bfd, STUB_LI16 | (h->dynindx << 1), stub + 8);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3370 struct bfd_link_info *info) 3370 struct bfd_link_info *info)
3371 { 3371 {
3372 bfd *dynobj; 3372 bfd *dynobj;
3373 asection *sdyn; 3373 asection *sdyn;
3374 asection *sgot; 3374 asection *sgot;
3375 asection *s; 3375 asection *s;
3376 struct score_got_info *g; 3376 struct score_got_info *g;
3377 3377
3378 dynobj = elf_hash_table (info)->dynobj; 3378 dynobj = elf_hash_table (info)->dynobj;
3379 3379
3380 sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); 3380 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3381 3381
3382 sgot = score_elf_got_section (dynobj, FALSE); 3382 sgot = score_elf_got_section (dynobj, FALSE);
3383 if (sgot == NULL) 3383 if (sgot == NULL)
3384 g = NULL; 3384 g = NULL;
3385 else 3385 else
3386 { 3386 {
3387 BFD_ASSERT (score_elf_section_data (sgot) != NULL); 3387 BFD_ASSERT (score_elf_section_data (sgot) != NULL);
3388 g = score_elf_section_data (sgot)->u.got_info; 3388 g = score_elf_section_data (sgot)->u.got_info;
3389 BFD_ASSERT (g != NULL); 3389 BFD_ASSERT (g != NULL);
3390 } 3390 }
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
3862 sdata = bfd_zalloc (abfd, amt); 3862 sdata = bfd_zalloc (abfd, amt);
3863 if (sdata == NULL) 3863 if (sdata == NULL)
3864 return FALSE; 3864 return FALSE;
3865 sec->used_by_bfd = sdata; 3865 sec->used_by_bfd = sdata;
3866 3866
3867 return _bfd_elf_new_section_hook (abfd, sec); 3867 return _bfd_elf_new_section_hook (abfd, sec);
3868 } 3868 }
3869 3869
3870 #define elf_backend_omit_section_dynsym \ 3870 #define elf_backend_omit_section_dynsym \
3871 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true) 3871 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
OLDNEW
« no previous file with comments | « bfd/elf32-score.c ('k') | bfd/elf32-sh.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698