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

Side by Side Diff: gold/layout.cc

Issue 10252012: [MIPS] Initial checkin for MIPS changes for GOLD. (Closed)
Patch Set: Created 8 years, 8 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 | « gold/layout.h ('k') | gold/mips.cc » ('j') | gold/output.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // layout.cc -- lay out output file sections for gold 1 // layout.cc -- lay out output file sections for gold
2 2
3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>. 4 // Written by Ian Lance Taylor <iant@google.com>.
5 5
6 // This file is part of gold. 6 // This file is part of gold.
7 7
8 // This program is free software; you can redistribute it and/or modify 8 // 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 9 // 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 10 // the Free Software Foundation; either version 3 of the License, or
(...skipping 2525 matching lines...) Expand 10 before | Expand all | Expand 10 after
2536 { 2536 {
2537 off = this->set_section_offsets(off, 2537 off = this->set_section_offsets(off,
2538 POSTPROCESSING_SECTIONS_PASS); 2538 POSTPROCESSING_SECTIONS_PASS);
2539 off = 2539 off =
2540 this->set_section_offsets(off, 2540 this->set_section_offsets(off,
2541 STRTAB_AFTER_POSTPROCESSING_SECTIONS_PASS); 2541 STRTAB_AFTER_POSTPROCESSING_SECTIONS_PASS);
2542 } 2542 }
2543 2543
2544 file_header->set_section_info(this->section_headers_, shstrtab_section); 2544 file_header->set_section_info(this->section_headers_, shstrtab_section);
2545 2545
2546 target->fix_sections(this, symtab);
robertm 2012/04/27 19:46:15 add a comment explaining what this does
Aleksandar Simeonov 2012/05/08 15:21:42 Sets data with values that are only known after se
robertm 2012/05/11 21:50:50 The description you give here is much better than
2547
2546 // Now we know exactly where everything goes in the output file 2548 // Now we know exactly where everything goes in the output file
2547 // (except for non-allocated sections which require postprocessing). 2549 // (except for non-allocated sections which require postprocessing).
2548 Output_data::layout_complete(); 2550 Output_data::layout_complete();
2549 2551
2550 this->output_file_size_ = off; 2552 this->output_file_size_ = off;
2551 2553
2552 return off; 2554 return off;
2553 } 2555 }
2554 2556
2555 // Create a note header following the format defined in the ELF ABI. 2557 // Create a note header following the format defined in the ELF ABI.
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 // The single PT_INTERP segment is required to precede any loadable 2968 // The single PT_INTERP segment is required to precede any loadable
2967 // segment. We simply make it always second. 2969 // segment. We simply make it always second.
2968 if (type1 == elfcpp::PT_INTERP) 2970 if (type1 == elfcpp::PT_INTERP)
2969 { 2971 {
2970 gold_assert(type2 != elfcpp::PT_INTERP); 2972 gold_assert(type2 != elfcpp::PT_INTERP);
2971 return true; 2973 return true;
2972 } 2974 }
2973 if (type2 == elfcpp::PT_INTERP) 2975 if (type2 == elfcpp::PT_INTERP)
2974 return false; 2976 return false;
2975 2977
2978 // This single PT_MIPS_REGINFO segment is required to precede any loadable
2979 // segment. We simply make it always third.
2980 // TODO AS: Make this only valid for MIPS !!!
2981 if (type1 == elfcpp::PT_MIPS_REGINFO)
2982 {
2983 gold_assert(type2 != elfcpp::PT_MIPS_REGINFO);
2984 return true;
2985 }
2986 if (type2 == elfcpp::PT_MIPS_REGINFO)
2987 return false;
2988
2976 // We then put PT_LOAD segments before any other segments. 2989 // We then put PT_LOAD segments before any other segments.
2977 if (type1 == elfcpp::PT_LOAD && type2 != elfcpp::PT_LOAD) 2990 if (type1 == elfcpp::PT_LOAD && type2 != elfcpp::PT_LOAD)
2978 return true; 2991 return true;
2979 if (type2 == elfcpp::PT_LOAD && type1 != elfcpp::PT_LOAD) 2992 if (type2 == elfcpp::PT_LOAD && type1 != elfcpp::PT_LOAD)
2980 return false; 2993 return false;
2981 2994
2995 // MIPS needs PT_NULL segment to be last.
2996 if (type1 == elfcpp::PT_NULL)
2997 {
2998 gold_assert(type2 != elfcpp::PT_NULL);
2999 return false;
3000 }
3001 if (type2 == elfcpp::PT_NULL)
3002 return true;
3003
2982 // We put the PT_TLS segment last except for the PT_GNU_RELRO 3004 // We put the PT_TLS segment last except for the PT_GNU_RELRO
2983 // segment, because that is where the dynamic linker expects to find 3005 // segment, because that is where the dynamic linker expects to find
2984 // it (this is just for efficiency; other positions would also work 3006 // it (this is just for efficiency; other positions would also work
2985 // correctly). 3007 // correctly).
2986 if (type1 == elfcpp::PT_TLS 3008 if (type1 == elfcpp::PT_TLS
2987 && type2 != elfcpp::PT_TLS 3009 && type2 != elfcpp::PT_TLS
2988 && type2 != elfcpp::PT_GNU_RELRO) 3010 && type2 != elfcpp::PT_GNU_RELRO)
2989 return false; 3011 return false;
2990 if (type2 == elfcpp::PT_TLS 3012 if (type2 == elfcpp::PT_TLS
2991 && type1 != elfcpp::PT_TLS 3013 && type1 != elfcpp::PT_TLS
(...skipping 1510 matching lines...) Expand 10 before | Expand all | Expand 10 after
4502 // Add a DT_TEXTREL for compatibility with older loaders. 4524 // Add a DT_TEXTREL for compatibility with older loaders.
4503 odyn->add_constant(elfcpp::DT_TEXTREL, 0); 4525 odyn->add_constant(elfcpp::DT_TEXTREL, 0);
4504 flags |= elfcpp::DF_TEXTREL; 4526 flags |= elfcpp::DF_TEXTREL;
4505 4527
4506 if (parameters->options().text()) 4528 if (parameters->options().text())
4507 gold_error(_("read-only segment has dynamic relocations")); 4529 gold_error(_("read-only segment has dynamic relocations"));
4508 else if (parameters->options().warn_shared_textrel() 4530 else if (parameters->options().warn_shared_textrel()
4509 && parameters->options().shared()) 4531 && parameters->options().shared())
4510 gold_warning(_("shared library text segment is not shareable")); 4532 gold_warning(_("shared library text segment is not shareable"));
4511 } 4533 }
4512 if (parameters->options().shared() && this->has_static_tls()) 4534 if ((parameters->options().shared() || parameters->options().pie())
4535 && this->has_static_tls())
4513 flags |= elfcpp::DF_STATIC_TLS; 4536 flags |= elfcpp::DF_STATIC_TLS;
4514 if (parameters->options().origin()) 4537 if (parameters->options().origin())
4515 flags |= elfcpp::DF_ORIGIN; 4538 flags |= elfcpp::DF_ORIGIN;
4516 if (parameters->options().Bsymbolic()) 4539 if (parameters->options().Bsymbolic())
4517 { 4540 {
4518 flags |= elfcpp::DF_SYMBOLIC; 4541 flags |= elfcpp::DF_SYMBOLIC;
4519 // Add DT_SYMBOLIC for compatibility with older loaders. 4542 // Add DT_SYMBOLIC for compatibility with older loaders.
4520 odyn->add_constant(elfcpp::DT_SYMBOLIC, 0); 4543 odyn->add_constant(elfcpp::DT_SYMBOLIC, 0);
4521 } 4544 }
4522 if (parameters->options().now()) 4545 if (parameters->options().now())
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after
5481 Layout::add_to_gdb_index(bool is_type_unit, 5504 Layout::add_to_gdb_index(bool is_type_unit,
5482 Sized_relobj<64, true>* object, 5505 Sized_relobj<64, true>* object,
5483 const unsigned char* symbols, 5506 const unsigned char* symbols,
5484 off_t symbols_size, 5507 off_t symbols_size,
5485 unsigned int shndx, 5508 unsigned int shndx,
5486 unsigned int reloc_shndx, 5509 unsigned int reloc_shndx,
5487 unsigned int reloc_type); 5510 unsigned int reloc_type);
5488 #endif 5511 #endif
5489 5512
5490 } // End namespace gold. 5513 } // End namespace gold.
OLDNEW
« no previous file with comments | « gold/layout.h ('k') | gold/mips.cc » ('j') | gold/output.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698