From: Ian Lance Taylor Date: Thu, 7 Feb 2008 05:45:07 +0000 (+0000) Subject: Ignore version scripts for relocatable links. X-Git-Tag: gdb_6_8-2008-02-26-branchpoint~172 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ef1f3d387940683bcba12c0bee8c5adfdef4bc7;p=external%2Fbinutils.git Ignore version scripts for relocatable links. --- diff --git a/gold/main.cc b/gold/main.cc index 2f68e06..6e35658 100644 --- a/gold/main.cc +++ b/gold/main.cc @@ -166,6 +166,16 @@ main(int argc, char** argv) write_debug_script(command_line.options().output_file_name(), program_name, args.c_str()); + // The GNU linker ignores version scripts when generating + // relocatable output. If we are not compatible, then we break the + // Linux kernel build, which uses a linker script with -r which must + // not force symbols to be local. It would actually be useful to + // permit symbols to be forced local with -r, though, as it would + // permit some linker optimizations. Perhaps we need yet another + // option to control this. FIXME. + if (parameters->output_is_object()) + command_line.script_options()->version_script_info()->clear(); + // The work queue. Workqueue workqueue(command_line.options()); diff --git a/gold/script.cc b/gold/script.cc index 7cf3c7e..fc510a5 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -1739,12 +1739,21 @@ struct Version_tree { Version_script_info::~Version_script_info() { + this->clear(); +} + +void +Version_script_info::clear() +{ for (size_t k = 0; k < dependency_lists_.size(); ++k) delete dependency_lists_[k]; + this->dependency_lists_.clear(); for (size_t k = 0; k < version_trees_.size(); ++k) delete version_trees_[k]; + this->version_trees_.clear(); for (size_t k = 0; k < expression_lists_.size(); ++k) delete expression_lists_[k]; + this->expression_lists_.clear(); } std::vector diff --git a/gold/script.h b/gold/script.h index 09f104f..81e7ab8 100644 --- a/gold/script.h +++ b/gold/script.h @@ -118,6 +118,10 @@ class Version_script_info public: ~Version_script_info(); + // Clear everything. + void + clear(); + // Return whether any version were defined in the version script. bool empty() const