Re: error: unknown type name ‘ctf_archive_t

Martin Sebor msebor@gmail.com
Tue Jun 2 16:53:10 GMT 2020


On 6/1/20 6:30 PM, Alan Modra wrote:
> On Mon, Jun 01, 2020 at 05:36:54PM -0600, Martin Sebor via Binutils wrote:
>> I've been getting the error below building binutils the last few
>> weeks:
>>
>> In file included from /src/binutils-gdb/ld/ldlex.l:31,
>>                   from /src/binutils-gdb/ld/ldlex-wrapper.c:26:
>> /src/binutils-gdb/ld/ldlang.h:304:3: error: unknown type name
>> ‘ctf_archive_t’
>>    304 |   ctf_archive_t *the_ctf;
>>        |   ^~~~~~~~~~~~~
>>
>> A discussion of it I found in bug 25064 suggests it's caused by
>> an outdated copy of the generated ld/ldlex.c file in the source
>> tree.  The build succeeds after I remove the file but I'd like
>> to know what other files I should remove (or more broadly, what
>> else I should do when re-building from a local copy) to make
>> sure I build what everyone else does. (I assume removing the whole
>> source tree and pulling a fresh copy is not the right way to do it.)
> 
> I'm curious.  What output from "make" do you see if you touch ldlex.l
> and then run make?  ldlex.c ought to be regenerated via a .l.c rule,
> even without --enable-maintainer-mode during configure.
> 
> I get the following.
> make[4]: Entering directory '/home/alan/build/gas/all/ld'
> /bin/bash /home/alan/src/binutils-gdb/ld/../ylwrap /home/alan/src/binutils-gdb/ld/ldlex.l lex.yy.c /home/alan/src/binutils-gdb/ld/ldlex.c -- flex
> 

I get something similar except ldlex.c is a relative file name:

make[4]: Entering directory '/ssd/build/binutils-gdb/ld'
/bin/sh /src/binutils-gdb/ld/../ylwrap /src/binutils-gdb/ld/ldlex.l 
lex.yy.c ldlex.c -- flex

and it's /build/binutils-gdb/ld/ldlex.c that's created.  Before it
was /src/binutils-gdb/ld/ldlex.c.

I wonder if building in a separate directory from the source tree
might have something to do with it.  It's even possible that some
time ago I (mistakenly) configured Binutils in the source directory
and didn't clean up after it.  I don't see any Makefiles or other
artifacts there but I did find a /src/binutils-gdb/etc/config.log
from 2017.

So what I believe happened was that an outdated ldlex.c was being
picked up from there rather than from the build directory.  I was
able to confirm that by creating an empty ld/ldlex.c file in
the source tree with just a #pragma error in it.

What made this tricky to debug is .gitignore hiding the file from
git status.  The source tree looks clean even when it has a bunch
of build artifacts in it that can then be picked by a subsequent
build in a different build directory, and there is no command to
remove it (make clean works on the new build directory).

Martin


More information about the Binutils mailing list