// 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;
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
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)