This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
gold patch committed: Avoid Stringpool index zero
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Thu, 24 Jul 2008 00:25:08 -0700
- Subject: gold patch committed: Avoid Stringpool index zero
A gold Stringpool has a key for each string. The key is not supposed
to have the value zero, as that is used as an invalid value.
Unfortunately, it could happen in some cases. It mostly doesn't
matter, but it can matter if the very first symbol we see happens to
have a version. I noticed this while testing a Linux kernel build.
I committed this patch to fix the problem.
Ian
2008-07-24 Ian Lance Taylor <iant@google.com>
* stringpool.cc (Stringpool_template::add_with_length): Set key to
array size plus one.
(Stringpool_template::set_string_offsets): Subtract one from key
before using it as an array index.
(Stringpool_template::get_offset_with_length): Likewise.
(Stringpool_template::write_to_buffer): Likewise.
* stringpool.h (Stringpool_template::get_offset_from_key):
Likewise.
Index: stringpool.h
===================================================================
RCS file: /cvs/src/src/gold/stringpool.h,v
retrieving revision 1.21
diff -u -p -r1.21 stringpool.h
--- stringpool.h 13 Mar 2008 21:04:21 -0000 1.21
+++ stringpool.h 24 Jul 2008 07:19:22 -0000
@@ -220,8 +220,8 @@ class Stringpool_template
section_offset_type
get_offset_from_key(Key k) const
{
- gold_assert(k < this->key_to_offset_.size());
- return this->key_to_offset_[k];
+ gold_assert(k <= this->key_to_offset_.size());
+ return this->key_to_offset_[k - 1];
}
// Get the size of the string table. This returns the number of
Index: stringpool.cc
===================================================================
RCS file: /cvs/src/src/gold/stringpool.cc,v
retrieving revision 1.27
diff -u -p -r1.27 stringpool.cc
--- stringpool.cc 13 Mar 2008 21:04:21 -0000 1.27
+++ stringpool.cc 24 Jul 2008 07:19:22 -0000
@@ -248,7 +248,8 @@ Stringpool_template<Stringpool_char>::ad
{
typedef std::pair<typename String_set_type::iterator, bool> Insert_type;
- const Key k = this->key_to_offset_.size();
+ // We add 1 so that 0 is always invalid.
+ const Key k = this->key_to_offset_.size() + 1;
if (!copy)
{
@@ -400,7 +401,7 @@ Stringpool_template<Stringpool_char>::se
curr != this->string_set_.end();
curr++)
{
- section_offset_type* poff = &this->key_to_offset_[curr->second];
+ section_offset_type* poff = &this->key_to_offset_[curr->second - 1];
if (this->zero_null_ && curr->first.string[0] == 0)
*poff = 0;
else
@@ -446,7 +447,7 @@ Stringpool_template<Stringpool_char>::se
this_offset = offset;
offset += ((*curr)->first.length + 1) * charsize;
}
- this->key_to_offset_[(*curr)->second] = this_offset;
+ this->key_to_offset_[(*curr)->second - 1] = this_offset;
last_offset = this_offset;
}
}
@@ -475,7 +476,7 @@ Stringpool_template<Stringpool_char>::ge
Hashkey hk(s, length);
typename String_set_type::const_iterator p = this->string_set_.find(hk);
if (p != this->string_set_.end())
- return this->key_to_offset_[p->second];
+ return this->key_to_offset_[p->second - 1];
gold_unreachable();
}
@@ -496,7 +497,7 @@ Stringpool_template<Stringpool_char>::wr
++p)
{
const int len = (p->first.length + 1) * sizeof(Stringpool_char);
- const section_offset_type offset = this->key_to_offset_[p->second];
+ const section_offset_type offset = this->key_to_offset_[p->second - 1];
gold_assert(static_cast<section_size_type>(offset) + len
<= this->strtab_size_);
memcpy(buffer + offset, p->first.string, len);