Next step in my ARM cross compilation journey...this error...
It's produced by arm-linux.ld which I've built from binutils upstream source (2.23.1) and am using for cross compiling using FPC 2.7.1.
It occurs when building a large project so I've not identified what may be triggering it yet. The relevant part of the ld source is:
if (may_need_local_target_p
&& elf32_arm_get_plt_info (abfd, eh, r_symndx, &root_plt, &arm_plt))
{
/* If PLT refcount book-keeping is wrong and too low, we'll
see a zero value (going to -1) for the root PLT reference
count. */
if (root_plt->refcount >= 0)
{
BFD_ASSERT (root_plt->refcount != 0);
root_plt->refcount -= 1;
}which says the procedure linkage table reference count is already zero when it should not be.
An apparently relevant discussion about it is here:
http://sourceware.org/ml/binutils/2012-04/msg00228.html
according to which, this assert arises in arm-linux-gnueabi when:
- There's a reference (call-reloc) to a symbol undefined at first reference, preliminary requiring a PLT.
- The symbols' definition is found in the linked objects and is hidden (or forced local).
- The referencing section (containing the call-reloc) is GC'd (its global symbols are forced local by the version script and found to be unused).
Then, the gc_sweep function tries to balance the books by -= 1 on the now-GC'd-away PLT (with refcount set to -1 from the already forced-local symbol) which is guarded by a "BFD_ASSERT (root_plt->refcount > 0)". So the assert strikes.
I will try to isolate what part of my build triggers this but I thought I'd post details in case anyone more familiar with GNU linking on ARM can suggest anything.
Bruce.
