X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Foptions.cc;h=0eb38ada837b0ac22d3de1be5740b6efb0cf1a10;hb=b0193076dad64abdb42ed0057ad668eaf3c17c7a;hp=73da963b1a1b725ac095f0a739622c6671d07aac;hpb=3dcad3765dd25e9f675683cd720524899930abfc;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/options.cc b/gold/options.cc index 73da963b1a..0eb38ada83 100644 --- a/gold/options.cc +++ b/gold/options.cc @@ -398,6 +398,63 @@ General_options::parse_just_symbols(const char*, const char* arg, cmdline->inputs().add_file(file); } +// Handle --section-start. + +void +General_options::parse_section_start(const char*, const char* arg, + Command_line*) +{ + const char* eq = strchr(arg, '='); + if (eq == NULL) + { + gold_error(_("invalid argument to --section-start; " + "must be SECTION=ADDRESS")); + return; + } + + std::string section_name(arg, eq - arg); + + ++eq; + const char* val_start = eq; + if (eq[0] == '0' && (eq[1] == 'x' || eq[1] == 'X')) + eq += 2; + if (*eq == '\0') + { + gold_error(_("--section-start address missing")); + return; + } + uint64_t addr = 0; + hex_init(); + for (; *eq != '\0'; ++eq) + { + if (!hex_p(*eq)) + { + gold_error(_("--section-start argument %s is not a valid hex number"), + val_start); + return; + } + addr <<= 4; + addr += hex_value(*eq); + } + + this->section_starts_[section_name] = addr; +} + +// Look up a --section-start value. + +bool +General_options::section_start(const char* secname, uint64_t* paddr) const +{ + if (this->section_starts_.empty()) + return false; + std::map::const_iterator p = + this->section_starts_.find(secname); + if (p == this->section_starts_.end()) + return false; + *paddr = p->second; + return true; +} + void General_options::parse_static(const char*, const char*, Command_line*) { @@ -442,6 +499,20 @@ General_options::parse_end_group(const char*, const char*, cmdline->inputs().end_group(); } +void +General_options::parse_start_lib(const char*, const char*, + Command_line* cmdline) +{ + cmdline->inputs().start_lib(cmdline->position_dependent_options()); +} + +void +General_options::parse_end_lib(const char*, const char*, + Command_line* cmdline) +{ + cmdline->inputs().end_lib(); +} + // The function add_excluded_libs() in ld/ldlang.c of GNU ld breaks up a list // of names seperated by commas or colons and puts them in a linked list. // We implement the same parsing of names here but store names in an unordered @@ -529,6 +600,20 @@ General_options::string_to_object_format(const char* arg) } } +void +General_options::parse_fix_v4bx(const char*, const char*, + Command_line*) +{ + this->fix_v4bx_ = FIX_V4BX_REPLACE; +} + +void +General_options::parse_fix_v4bx_interworking(const char*, const char*, + Command_line*) +{ + this->fix_v4bx_ = FIX_V4BX_INTERWORKING; +} + } // End namespace gold. namespace @@ -749,9 +834,18 @@ namespace gold General_options::General_options() : printed_version_(false), - execstack_status_(General_options::EXECSTACK_FROM_INPUT), static_(false), - do_demangle_(false), plugins_(), - incremental_disposition_(INCREMENTAL_CHECK), implicit_incremental_(false) + execstack_status_(EXECSTACK_FROM_INPUT), + icf_status_(ICF_NONE), + static_(false), + do_demangle_(false), + plugins_(NULL), + dynamic_list_(), + incremental_disposition_(INCREMENTAL_CHECK), + implicit_incremental_(false), + excluded_libs_(), + symbols_to_retain_(), + section_starts_(), + fix_v4bx_(FIX_V4BX_NONE) { // Turn off option registration once construction is complete. gold::options::ready_to_register = false; @@ -1081,14 +1175,20 @@ Search_directory::add_sysroot(const char* sysroot, void Input_arguments::add_file(const Input_file_argument& file) { - if (!this->in_group_) - this->input_argument_list_.push_back(Input_argument(file)); - else + if (this->in_group_) { gold_assert(!this->input_argument_list_.empty()); gold_assert(this->input_argument_list_.back().is_group()); this->input_argument_list_.back().group()->add_file(file); } + else if (this->in_lib_) + { + gold_assert(!this->input_argument_list_.empty()); + gold_assert(this->input_argument_list_.back().is_lib()); + this->input_argument_list_.back().lib()->add_file(file); + } + else + this->input_argument_list_.push_back(Input_argument(file)); } // Start a group. @@ -1098,6 +1198,8 @@ Input_arguments::start_group() { if (this->in_group_) gold_fatal(_("May not nest groups")); + if (this->in_lib_) + gold_fatal(_("may not nest groups in libraries")); Input_file_group* group = new Input_file_group(); this->input_argument_list_.push_back(Input_argument(group)); this->in_group_ = true; @@ -1113,6 +1215,30 @@ Input_arguments::end_group() this->in_group_ = false; } +// Start a lib. + +void +Input_arguments::start_lib(const Position_dependent_options& options) +{ + if (this->in_lib_) + gold_fatal(_("may not nest libraries")); + if (this->in_group_) + gold_fatal(_("may not nest libraries in groups")); + Input_file_lib* lib = new Input_file_lib(options); + this->input_argument_list_.push_back(Input_argument(lib)); + this->in_lib_ = true; +} + +// End a lib. + +void +Input_arguments::end_lib() +{ + if (!this->in_lib_) + gold_fatal(_("lib end without lib start")); + this->in_lib_ = false; +} + // Command_line options. Command_line::Command_line() @@ -1209,4 +1335,15 @@ Command_line::process(int argc, const char** argv) this->options_.finalize(); } +// Finalize the version script options and return them. + +const Version_script_info& +Command_line::version_script() +{ + this->options_.finalize_dynamic_list(); + Version_script_info* vsi = this->script_options_.version_script_info(); + vsi->finalize(); + return *vsi; +} + } // End namespace gold.