This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [gold] "entry in mergeable string section not null terminated"
On Thu, Mar 19, 2009 at 12:18:42PM -0700, Ian Lance Taylor wrote:
> Cary Coutant <ccoutant@google.com> writes:
>
> > Certain sections in your relocatable object files contain read-only
> > string data; the linker tries to optimize the size of your executable
> > by merging these sections together and eliminating any duplicate
> > strings. For that to work, each section marked as a mergeable string
> > section (one with the flags SHF_MERGE and SHF_STRINGS set) must
> > consist entirely of null-terminated strings, one after the other, so
> > that the linker can find each individual string.
> >
> > This error message is telling you that it found a section marked with
> > SHF_MERGE and SHF_STRINGS, but that the section didn't end with a
> > null. If you can gzip your archive
> > libApplicationComponents_AnatomicProgram-debug.a and send it to me,
> > I'll take a look and see if I can spot the problem. I'm not sure if
> > the gnu linker is more tolerant, or if it just wasn't trying to do the
> > constant merging optimization.
>
> The GNU linker does implement this optimization, and it is more
> tolerant. When merging a string section, it reads the section into
> memory, and explicitly pads it with a null character. The code refers
> to a gcc patch
>
> http://gcc.gnu.org/ml/gcc-patches/2006-06/msg01004.html
>
> which fixes a case where gcc marked a section as containing mergeable
> strings even though the strings were not null terminated. This was
> fixed in gcc 4.1.2, so if Peter is using an earlier version of gcc that
> could conceivably be the problem here.
>
Hm. I'm using the g++ from opensuse 11.1. As I am not on that specific computer
I could only look on
http://download.opensuse.org/distribution/11.1/repo/oss/suse/i586/
to guess which g++ I am using.
There are 3 versions:
gcc43-c++-4.3.3_20081022-9.5.i586.rpm
gcc41-c++-4.1.3_20080612-26.5.i586.rpm
gcc33-c++-3.3.3-7.5.i586.rpm (<- not relevant, because I have
at least 4.x)
So it seems my g++ is recent enough.
FYI, gold was installed from
http://download.opensuse.org/factory/repo/oss/suse/i586/binutils-gold-2.19.51-5.22.i586.rpm
> gold could use a similar workaround. In fact, if we just demote the
> error to a warning, I think everything would work fine. Peter, would
> you be interested in trying such a patch? Change this line in
> gold/merge.cc
>
> object->error(_("entry in mergeable string section "
> "not null terminated"));
>
> to something like
>
> gold_warning(_("%s: entry in mergeable string section "
> "not null terminated"),
> object->name().c_str());
>
I will give it a try next time I'll be at the PC with that environment (and the
sources), which will propably be tomorrow.
-Peter