aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2008-02-07 05:45:07 +0000
committerIan Lance Taylor <iant@google.com>2008-02-07 05:45:07 +0000
commit1ef1f3d387940683bcba12c0bee8c5adfdef4bc7 (patch)
tree9868865fdd392b1acb03a2de230185da323bdef8 /gold
parent5fe2a0f55b19713f5cfb423687ce51291c62d8d8 (diff)
downloadgdb-1ef1f3d387940683bcba12c0bee8c5adfdef4bc7.zip
gdb-1ef1f3d387940683bcba12c0bee8c5adfdef4bc7.tar.gz
gdb-1ef1f3d387940683bcba12c0bee8c5adfdef4bc7.tar.bz2
Ignore version scripts for relocatable links.
Diffstat (limited to 'gold')
-rw-r--r--gold/main.cc10
-rw-r--r--gold/script.cc9
-rw-r--r--gold/script.h4
3 files changed, 23 insertions, 0 deletions
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<std::string>
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