diff options
author | Ian Lance Taylor <iant@google.com> | 2007-10-10 06:33:56 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-10-10 06:33:56 +0000 |
commit | cec9d2f362a9f1c13aad15caed66493463efb674 (patch) | |
tree | 711b97acffe7fb945ae78afb0f2009548aba68b5 | |
parent | 4e9d858638034246a4ab4595f5497c7393c3bfbf (diff) | |
download | fsf-binutils-gdb-cec9d2f362a9f1c13aad15caed66493463efb674.zip fsf-binutils-gdb-cec9d2f362a9f1c13aad15caed66493463efb674.tar.gz fsf-binutils-gdb-cec9d2f362a9f1c13aad15caed66493463efb674.tar.bz2 |
From Craig Silverstein: don't get confused if the same file name
occurs in an archive.
-rw-r--r-- | gold/merge.cc | 10 | ||||
-rw-r--r-- | gold/object.h | 10 |
2 files changed, 14 insertions, 6 deletions
diff --git a/gold/merge.cc b/gold/merge.cc index 0db62ef..75cbc18 100644 --- a/gold/merge.cc +++ b/gold/merge.cc @@ -40,7 +40,15 @@ Output_merge_base::Merge_key_less::operator()(const Merge_key& mk1, // matter. We want to get consistent results across links so we // don't use pointer comparison. if (mk1.object != mk2.object) - return mk1.object->name() < mk2.object->name(); + { + // Two different object files can have the same name: if foo.a + // includes both bar/qux.o and baz/qux.o, then both end up with + // the name foo.a(qux.o). But it's impossible for two different + // object files to have both the same name and the same offset. + if (mk1.object->offset() != mk2.object->offset()) + return mk1.object->offset() < mk2.object->offset(); + return mk1.object->name() < mk2.object->name(); + } if (mk1.shndx != mk2.shndx) return mk1.shndx < mk2.shndx; return mk1.offset < mk2.offset; diff --git a/gold/object.h b/gold/object.h index 2baf2da..8f0a3b7 100644 --- a/gold/object.h +++ b/gold/object.h @@ -130,6 +130,11 @@ class Object name() const { return this->name_; } + // Get the offset into the file. + off_t + offset() const + { return this->offset_; } + // Return whether this is a dynamic object. bool is_dynamic() const @@ -277,11 +282,6 @@ class Object input_file() const { return this->input_file_; } - // Get the offset into the file. - off_t - offset() const - { return this->offset_; } - // Get a view into the underlying file. const unsigned char* get_view(off_t start, off_t size, bool cache) |