Sources Bugzilla – Bug 13710
[Regression] .def files containing LIBRARY statement can't be parsed any more
Last modified: 2012-02-24 14:24:53 UTC
In the last couple of days a change was applied to binutils which makes the
behaviour of the processing of .def files more strict. Due to this change some
libraries fail to compile, for example cairo.
The .def file which is used by cairo contains something along the lines of
This used to work fine with binutils 18.104.22.16820113, but when using binutils
22.214.171.12420216 this results in the following error:
a.def:3: syntax error
file format not recognized; treating as linker script
collect2: error: ld returned 1 exit status
After some discussion with Kai Tietz we came to the conclusion that these type
of .def files are invalid according to MSDN:
This documentation indicates that .def files must start with the 'LIBRARY
xxx.dll' statement followed by the 'EXPORTS' statement, so in this regard the
more strict behaviour of binutils is correct.
So I tried fixing cairo so that it uses a .def file which looks like this:
While doing so I noticed that libtool also tries to do some funny things with
the .def file:
libtool: link: if test "x`/bin/sed 1q .libs/libcairo.def`" = xEXPORTS; then cp
.libs/libcairo.def .libs/libcairo-2.dll.def; else echo EXPORTS >
.libs/libcairo-2.dll.def; cat .libs/libcairo.def >> .libs/libcairo-2.dll.def;
It looks like libtool always checks the first line of the given .def file. If
this first line isn't 'EXPORTS' then it will be automatically added to the
resulting .def file. Given the .def file above, the resulting .def file will
This .def file isn't accepted by binutils as well.
So to fix all this, changes have to be applied to both cairo and libtool.
However, the annoying thing with libtool is that every libtool-using piece of
software is bundling their own copy of libtool so it will take quite some time
before a patched version of libtool is really in use. While I agree that
binutils should be as compliant and strict as possible I think that the damage
here is worse than the benefits. So I would like to suggest that this change in
behaviour in binutils is reverted to the old behaviour (for now) and that we
also try to get this fixed properly in libtool, cairo and perhaps several other
pieces of software.
Filed bugs for libtool and cairo:
Module name: src
Changes by: email@example.com 2012-02-24 14:20:19
binutils : ChangeLog defparse.y
binutils/doc : binutils.texi
ld : ChangeLog deffilep.y
* defparse.y (keyword_as_name): Disable LIBRARY
* doc/binutils.texi: Document LIBRARY exception.
* deffilep.y (keyword_as_name): Disable LIBRARY