[gold] Merging string literals with bigger alignment

Cary Coutant ccoutant@google.com
Thu Mar 28 18:18:00 GMT 2013


+  // We assume here that the beginning of the section is correctly
+  // aligned, so each string within the section must retain the same
+  // modulo.
+  uint64_t init_align_modulo = (uint64_t) pdata % this->addralign();

The view you're looking at will already be aligned correctly, so I
don't think this is necessary (i.e., init_align_modulo will always be
0).

+  if ((uint64_t) p % this->addralign() != init_align_modulo)
+    gold_warning(_("string %s is incorrectly aligned within"
+   " the section %s. Its alignment won't be preserved"),
+ (unsigned char*)p,
+ object->section_name(shndx).c_str());

If Char_type is not char, printing (unsigned char*)p with %s will not
work. Also, this cast should use reinterpret_cast<...>(p) instead of
the C-style cast.

I think you'll also need to change
Stringpool_template<Stringpool_char>::Stringpool_eq::operator() to
check the alignment that you've stored in the Hashkey. Imagine one
section that adds a string with alignment 1, and a subsequent section
that adds the same string with alignment 4 -- when adding the string
the second time, you'll match the first, and keep the 1-byte
alignment. Ideally, you'd just update the alignment so there's only
one copy of the string at the larger alignment, but that will only
work if you're optimizing the string tables (-O2).

-cary



More information about the Binutils mailing list