X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fparameters.cc;h=d677044a079dbbde43a9dd90ad52d5557a6ff5e0;hb=2da4b788f7a80ed9589d0e8856584e9dfa2813ff;hp=0384dd68081664870cc67d438277da5ec5e5dcc8;hpb=9fbd3822ad34dced1ec88410f3f1b447d30e6435;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/parameters.cc b/gold/parameters.cc index 0384dd6808..d677044a07 100644 --- a/gold/parameters.cc +++ b/gold/parameters.cc @@ -1,6 +1,6 @@ // parameters.cc -- general parameters for a link using gold -// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -64,7 +64,7 @@ Set_parameters_target_once set_parameters_target_once(&static_parameters); // Class Parameters. Parameters::Parameters() - : errors_(NULL), options_(NULL), target_(NULL), + : errors_(NULL), timer_(NULL), options_(NULL), target_(NULL), doing_static_link_valid_(false), doing_static_link_(false), debug_(0), incremental_mode_(General_options::INCREMENTAL_OFF), set_parameters_target_once_(&set_parameters_target_once) @@ -78,6 +78,13 @@ Parameters::set_errors(Errors* errors) this->errors_ = errors; } +void +Parameters::set_timer(Timer* timer) +{ + gold_assert(this->timer_ == NULL); + this->timer_ = timer; +} + void Parameters::set_options(const General_options* options) { @@ -118,8 +125,12 @@ Parameters::set_target_once(Target* target) { gold_assert(this->target_ == NULL); this->target_ = target; + target->select_as_default_target(); if (this->options_valid()) - this->check_target_endianness(); + { + this->check_target_endianness(); + this->check_rodata_segment(); + } } // Clear the target, for testing. @@ -205,23 +216,29 @@ Parameters::check_target_endianness() gold_assert(endianness == General_options::ENDIANNESS_LITTLE); big_endian = false;; } - + if (this->target().is_big_endian() != big_endian) gold_error(_("input file does not match -EB/EL option")); } } +void +Parameters::check_rodata_segment() +{ + if (this->options().user_set_Trodata_segment() + && !this->options().rosegment() + && !this->target().isolate_execinstr()) + gold_error(_("-Trodata-segment is meaningless without --rosegment")); +} + // Return the name of the entry symbol. const char* Parameters::entry() const { const char* ret = this->options().entry(); - if (ret == NULL) - { - // FIXME: Need to support target specific entry symbol. - ret = "_start"; - } + if (ret == NULL && parameters->target_valid()) + ret = parameters->target().entry_symbol_name(); return ret; } @@ -269,6 +286,10 @@ void set_parameters_errors(Errors* errors) { static_parameters.set_errors(errors); } +void +set_parameters_timer(Timer* timer) +{ static_parameters.set_timer(timer); } + void set_parameters_options(const General_options* options) { static_parameters.set_options(options); } @@ -277,7 +298,6 @@ void set_parameters_target(Target* target) { static_parameters.set_target(target); - target->select_as_default_target(); } void @@ -341,12 +361,19 @@ parameters_force_valid_target() else is_big_endian = GOLD_DEFAULT_BIG_ENDIAN; - Target* target = select_target(elfcpp::GOLD_DEFAULT_MACHINE, + Target* target = select_target(NULL, 0, + elfcpp::GOLD_DEFAULT_MACHINE, GOLD_DEFAULT_SIZE, is_big_endian, elfcpp::GOLD_DEFAULT_OSABI, 0); - gold_assert(target != NULL); + + if (target == NULL) + { + gold_assert(is_big_endian != GOLD_DEFAULT_BIG_ENDIAN); + gold_fatal(_("no supported target for -EB/-EL option")); + } + set_parameters_target(target); }