[fpc-devel] BFD (GNU Binutils) 2.23.1 assertion fail elf32-arm.c:12328

Bruce Tulloch pascal at causal.com
Sat May 25 02:57:08 CEST 2013


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.



More information about the fpc-devel mailing list