This is the mail archive of the mailing list for the binutils project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gold] Merging string literals with bigger alignment

On Thu, Mar 28, 2013 at 11:17 AM, Cary Coutant <> wrote:
> +  // 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).

BFD linker drops the 1-byte aligned entry in hash table and adds
a new one with 4-byte alignment.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]