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

Side by Side Diff: bfd/elf32-cr16.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-bfin.c ('k') | bfd/elf32-cr16c.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
None
OLDNEW
1 /* BFD back-end for National Semiconductor's CR16 ELF 1 /* BFD back-end for National Semiconductor's CR16 ELF
2 Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc. 2 Copyright 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
3 Written by M R Swami Reddy. 3 Written by M R Swami Reddy.
4 4
5 This file is part of BFD, the Binary File Descriptor library. 5 This file is part of BFD, the Binary File Descriptor library.
6 6
7 This program is free software; you can redistribute it and/or modify 7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or 9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version. 10 (at your option) any later version.
11 11
12 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 static bfd_boolean 578 static bfd_boolean
579 _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info) 579 _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info)
580 { 580 {
581 flagword flags; 581 flagword flags;
582 asection * s; 582 asection * s;
583 struct elf_link_hash_entry * h; 583 struct elf_link_hash_entry * h;
584 const struct elf_backend_data * bed = get_elf_backend_data (abfd); 584 const struct elf_backend_data * bed = get_elf_backend_data (abfd);
585 int ptralign; 585 int ptralign;
586 586
587 /* This function may be called more than once. */ 587 /* This function may be called more than once. */
588 if (bfd_get_section_by_name (abfd, ".got") != NULL) 588 if (bfd_get_linker_section (abfd, ".got") != NULL)
589 return TRUE; 589 return TRUE;
590 590
591 switch (bed->s->arch_size) 591 switch (bed->s->arch_size)
592 { 592 {
593 case 16: 593 case 16:
594 ptralign = 1; 594 ptralign = 1;
595 break; 595 break;
596 596
597 case 32: 597 case 32:
598 ptralign = 2; 598 ptralign = 2;
599 break; 599 break;
600 600
601 default: 601 default:
602 bfd_set_error (bfd_error_bad_value); 602 bfd_set_error (bfd_error_bad_value);
603 return FALSE; 603 return FALSE;
604 } 604 }
605 605
606 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 606 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
607 | SEC_LINKER_CREATED); 607 | SEC_LINKER_CREATED);
608 608
609 s = bfd_make_section_with_flags (abfd, ".got", flags); 609 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
610 if (s == NULL 610 if (s == NULL
611 || ! bfd_set_section_alignment (abfd, s, ptralign)) 611 || ! bfd_set_section_alignment (abfd, s, ptralign))
612 return FALSE; 612 return FALSE;
613 613
614 if (bed->want_got_plt) 614 if (bed->want_got_plt)
615 { 615 {
616 s = bfd_make_section_with_flags (abfd, ".got.plt", flags); 616 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
617 if (s == NULL 617 if (s == NULL
618 || ! bfd_set_section_alignment (abfd, s, ptralign)) 618 || ! bfd_set_section_alignment (abfd, s, ptralign))
619 return FALSE; 619 return FALSE;
620 } 620 }
621 621
622 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got 622 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
623 (or .got.plt) section. We don't do this in the linker script 623 (or .got.plt) section. We don't do this in the linker script
624 because we don't want to define the symbol if we are not creating 624 because we don't want to define the symbol if we are not creating
625 a global offset table. */ 625 a global offset table. */
626 h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_"); 626 h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 } 745 }
746 746
747 switch (ELF32_R_TYPE (rel->r_info)) 747 switch (ELF32_R_TYPE (rel->r_info))
748 { 748 {
749 case R_CR16_GOT_REGREL20: 749 case R_CR16_GOT_REGREL20:
750 case R_CR16_GOTC_REGREL20: 750 case R_CR16_GOTC_REGREL20:
751 /* This symbol requires a global offset table entry. */ 751 /* This symbol requires a global offset table entry. */
752 752
753 if (sgot == NULL) 753 if (sgot == NULL)
754 { 754 {
755 sgot = bfd_get_section_by_name (dynobj, ".got"); 755 sgot = bfd_get_linker_section (dynobj, ".got");
756 BFD_ASSERT (sgot != NULL); 756 BFD_ASSERT (sgot != NULL);
757 } 757 }
758 758
759 if (srelgot == NULL 759 if (srelgot == NULL
760 && (h != NULL || info->executable)) 760 && (h != NULL || info->executable))
761 { 761 {
762 srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); 762 srelgot = bfd_get_linker_section (dynobj, ".rela.got");
763 if (srelgot == NULL) 763 if (srelgot == NULL)
764 { 764 {
765 srelgot = bfd_make_section_with_flags (dynobj, 765 » » flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
766 ".rela.got", 766 » » » » | SEC_IN_MEMORY | SEC_LINKER_CREATED
767 (SEC_ALLOC 767 » » » » | SEC_READONLY);
768 | SEC_LOAD 768 » » srelgot = bfd_make_section_anyway_with_flags (dynobj,
769 | SEC_HAS_CONTENTS 769 » » » » » » » » ".rela.got",
770 | SEC_IN_MEMORY 770 » » » » » » » » flags);
771 | SEC_LINKER_CREATED
772 | SEC_READONLY));
773 if (srelgot == NULL 771 if (srelgot == NULL
774 || ! bfd_set_section_alignment (dynobj, srelgot, 2)) 772 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
775 goto fail; 773 goto fail;
776 } 774 }
777 } 775 }
778 776
779 if (h != NULL) 777 if (h != NULL)
780 { 778 {
781 if (h->got.offset != (bfd_vma) -1) 779 if (h->got.offset != (bfd_vma) -1)
782 /* We have already allocated space in the .got. */ 780 /* We have already allocated space in the .got. */
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 /* Check for range. */ 1038 /* Check for range. */
1041 if ((long) Rvalue > 0xfffff || (long) Rvalue < 0x0) 1039 if ((long) Rvalue > 0xfffff || (long) Rvalue < 0x0)
1042 return bfd_reloc_overflow; 1040 return bfd_reloc_overflow;
1043 1041
1044 bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0) 1042 bfd_put_16 (input_bfd, ((bfd_get_16 (input_bfd, hit_data) & 0xfff0)
1045 | ((Rvalue >> 16) & 0xf)), hit_data); 1043 | ((Rvalue >> 16) & 0xf)), hit_data);
1046 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2); 1044 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1047 } 1045 }
1048 else if (r_type == R_CR16_GOT_REGREL20) 1046 else if (r_type == R_CR16_GOT_REGREL20)
1049 { 1047 {
1050 asection * sgot = bfd_get_section_by_name (dynobj, ".got"); 1048 asection * sgot = bfd_get_linker_section (dynobj, ".got");
1051 1049
1052 if (h != NULL) 1050 if (h != NULL)
1053 { 1051 {
1054 bfd_vma off; 1052 bfd_vma off;
1055 1053
1056 off = h->got.offset; 1054 off = h->got.offset;
1057 BFD_ASSERT (off != (bfd_vma) -1); 1055 BFD_ASSERT (off != (bfd_vma) -1);
1058 1056
1059 if (! elf_hash_table (info)->dynamic_sections_created 1057 if (! elf_hash_table (info)->dynamic_sections_created
1060 || SYMBOL_REFERENCES_LOCAL (info, h)) 1058 || SYMBOL_REFERENCES_LOCAL (info, h))
(...skipping 28 matching lines...) Expand all
1089 1087
1090 1088
1091 bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data)) 1089 bfd_put_16 (input_bfd, (bfd_get_16 (input_bfd, hit_data))
1092 | (((Rvalue >> 16) & 0xf) << 8), hit_data); 1090 | (((Rvalue >> 16) & 0xf) << 8), hit_data);
1093 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2); 1091 bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2);
1094 1092
1095 } 1093 }
1096 else if (r_type == R_CR16_GOTC_REGREL20) 1094 else if (r_type == R_CR16_GOTC_REGREL20)
1097 { 1095 {
1098 asection * sgot; 1096 asection * sgot;
1099 sgot = bfd_get_section_by_name (dynobj, ".got"); 1097 sgot = bfd_get_linker_section (dynobj, ".got");
1100 1098
1101 if (h != NULL) 1099 if (h != NULL)
1102 { 1100 {
1103 bfd_vma off; 1101 bfd_vma off;
1104 1102
1105 off = h->got.offset; 1103 off = h->got.offset;
1106 BFD_ASSERT (off != (bfd_vma) -1); 1104 BFD_ASSERT (off != (bfd_vma) -1);
1107 1105
1108 Rvalue >>=1; /* For code symbols. */ 1106 Rvalue >>=1; /* For code symbols. */
1109 1107
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1424 else 1422 else
1425 { 1423 {
1426 bfd_boolean unresolved_reloc, warned; 1424 bfd_boolean unresolved_reloc, warned;
1427 1425
1428 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 1426 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1429 r_symndx, symtab_hdr, sym_hashes, 1427 r_symndx, symtab_hdr, sym_hashes,
1430 h, sec, relocation, 1428 h, sec, relocation,
1431 unresolved_reloc, warned); 1429 unresolved_reloc, warned);
1432 } 1430 }
1433 1431
1434 if (sec != NULL && elf_discarded_section (sec)) 1432 if (sec != NULL && discarded_section (sec))
1435 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 1433 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1436 » » » » » rel, relend, howto, contents); 1434 » » » » » rel, 1, relend, howto, 0, contents);
1437 1435
1438 if (info->relocatable) 1436 if (info->relocatable)
1439 continue; 1437 continue;
1440 1438
1441 r = cr16_elf_final_link_relocate (howto, input_bfd, output_bfd, 1439 r = cr16_elf_final_link_relocate (howto, input_bfd, output_bfd,
1442 input_section, 1440 input_section,
1443 contents, rel->r_offset, 1441 contents, rel->r_offset,
1444 relocation, rel->r_addend, 1442 relocation, rel->r_addend,
1445 (struct elf_link_hash_entry *) h, 1443 (struct elf_link_hash_entry *) h,
1446 r_symndx, 1444 r_symndx,
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 bfd_set_error (bfd_error_bad_value); 2269 bfd_set_error (bfd_error_bad_value);
2272 return FALSE; 2270 return FALSE;
2273 } 2271 }
2274 2272
2275 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and 2273 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2276 .rel[a].bss sections. */ 2274 .rel[a].bss sections. */
2277 2275
2278 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 2276 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2279 | SEC_LINKER_CREATED); 2277 | SEC_LINKER_CREATED);
2280 2278
2281 s = bfd_make_section_with_flags (abfd, 2279 s = bfd_make_section_anyway_with_flags (abfd,
2282 (bed->default_use_rela_p 2280 » » » » » (bed->default_use_rela_p
2283 ? ".rela.plt" : ".rel.plt"), 2281 » » » » » ? ".rela.plt" : ".rel.plt"),
2284 flags | SEC_READONLY); 2282 » » » » » flags | SEC_READONLY);
2285 if (s == NULL 2283 if (s == NULL
2286 || ! bfd_set_section_alignment (abfd, s, ptralign)) 2284 || ! bfd_set_section_alignment (abfd, s, ptralign))
2287 return FALSE; 2285 return FALSE;
2288 2286
2289 if (! _bfd_cr16_elf_create_got_section (abfd, info)) 2287 if (! _bfd_cr16_elf_create_got_section (abfd, info))
2290 return FALSE; 2288 return FALSE;
2291 2289
2292 {
2293 const char * secname;
2294 char * relname;
2295 flagword secflags;
2296 asection * sec;
2297
2298 for (sec = abfd->sections; sec; sec = sec->next)
2299 {
2300 secflags = bfd_get_section_flags (abfd, sec);
2301 if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
2302 || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
2303 continue;
2304
2305 secname = bfd_get_section_name (abfd, sec);
2306 relname = (char *) bfd_malloc (strlen (secname) + 6);
2307 strcpy (relname, ".rela");
2308 strcat (relname, secname);
2309
2310 s = bfd_make_section_with_flags (abfd, relname,
2311 flags | SEC_READONLY);
2312 if (s == NULL
2313 || ! bfd_set_section_alignment (abfd, s, ptralign))
2314 return FALSE;
2315 }
2316 }
2317
2318 if (bed->want_dynbss) 2290 if (bed->want_dynbss)
2319 { 2291 {
2320 /* The .dynbss section is a place to put symbols which are defined 2292 /* The .dynbss section is a place to put symbols which are defined
2321 by dynamic objects, are referenced by regular objects, and are 2293 by dynamic objects, are referenced by regular objects, and are
2322 not functions. We must allocate space for them in the process 2294 not functions. We must allocate space for them in the process
2323 image and use a R_*_COPY reloc to tell the dynamic linker to 2295 image and use a R_*_COPY reloc to tell the dynamic linker to
2324 initialize them at run time. The linker script puts the .dynbss 2296 initialize them at run time. The linker script puts the .dynbss
2325 section into the .bss section of the final image. */ 2297 section into the .bss section of the final image. */
2326 s = bfd_make_section_with_flags (abfd, ".dynbss", 2298 s = bfd_make_section_anyway_with_flags (abfd, ".dynbss",
2327 SEC_ALLOC | SEC_LINKER_CREATED); 2299 » » » » » SEC_ALLOC | SEC_LINKER_CREATED);
2328 if (s == NULL) 2300 if (s == NULL)
2329 return FALSE; 2301 return FALSE;
2330 2302
2331 /* The .rel[a].bss section holds copy relocs. This section is not 2303 /* The .rel[a].bss section holds copy relocs. This section is not
2332 normally needed. We need to create it here, though, so that the 2304 normally needed. We need to create it here, though, so that the
2333 linker will map it to an output section. We can't just create it 2305 linker will map it to an output section. We can't just create it
2334 only if we need it, because we will not know whether we need it 2306 only if we need it, because we will not know whether we need it
2335 until we have seen all the input files, and the first time the 2307 until we have seen all the input files, and the first time the
2336 main linker code calls BFD after examining all the input files 2308 main linker code calls BFD after examining all the input files
2337 (size_dynamic_sections) the input sections have already been 2309 (size_dynamic_sections) the input sections have already been
2338 mapped to the output sections. If the section turns out not to 2310 mapped to the output sections. If the section turns out not to
2339 be needed, we can discard it later. We will never need this 2311 be needed, we can discard it later. We will never need this
2340 section when generating a shared object, since they do not use 2312 section when generating a shared object, since they do not use
2341 copy relocs. */ 2313 copy relocs. */
2342 if (! info->executable) 2314 if (! info->executable)
2343 { 2315 {
2344 s = bfd_make_section_with_flags (abfd, 2316 s = bfd_make_section_anyway_with_flags (abfd,
2345 (bed->default_use_rela_p 2317 » » » » » » (bed->default_use_rela_p
2346 ? ".rela.bss" : ".rel.bss"), 2318 » » » » » » ? ".rela.bss" : ".rel.bss"),
2347 flags | SEC_READONLY); 2319 » » » » » » flags | SEC_READONLY);
2348 if (s == NULL 2320 if (s == NULL
2349 || ! bfd_set_section_alignment (abfd, s, ptralign)) 2321 || ! bfd_set_section_alignment (abfd, s, ptralign))
2350 return FALSE; 2322 return FALSE;
2351 } 2323 }
2352 } 2324 }
2353 2325
2354 return TRUE; 2326 return TRUE;
2355 } 2327 }
2356 2328
2357 2329
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2396 BFD_ASSERT (h->needs_plt); 2368 BFD_ASSERT (h->needs_plt);
2397 return TRUE; 2369 return TRUE;
2398 } 2370 }
2399 2371
2400 /* Make sure this symbol is output as a dynamic symbol. */ 2372 /* Make sure this symbol is output as a dynamic symbol. */
2401 if (h->dynindx == -1) 2373 if (h->dynindx == -1)
2402 { 2374 {
2403 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2375 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2404 return FALSE; 2376 return FALSE;
2405 } 2377 }

error: old chunk mismatch

OLDNEW
« no previous file with comments | « bfd/elf32-bfin.c ('k') | bfd/elf32-cr16c.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698