https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81487
Bug ID: 81487
Summary: [mingw32] ld.exe: error: asprintf failed
Product: gcc
Version: 7.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: lto
Assignee: unassigned at gcc dot gnu.org
Reporter: gjl at gcc dot gnu.org
CC: marxin at gcc dot gnu.org
Target Milestone: ---
Compiling a trivial program fails:
int main()
{
return 0;
}
$ avr-gcc simple.c -mmcu=atmega8 -v
Using built-in specs.
Reading specs from
e:/winavr/8.0_2017-07-18/bin/../lib/gcc/avr/8.0.0/device-specs/specs-atmega8
COLLECT_GCC=e:/WinAVR/8.0_2017-07-18/bin/avr-gcc
COLLECT_LTO_WRAPPER=e:/winavr/8.0_2017-07-18/bin/../libexec/gcc/avr/8.0.0/lto-wrapper.exe
Target: avr
Configured with: ../../gcc.gnu.org/trunk/configure --target=avr --disable-nls
--prefix=/local/gnu/install/gcc-8-avr-mingw32 --host=i686-w64-mingw32
--build=x86_64-linux-gnu --enable-languages=c,c++,lto --with-gnu-as
--with-gnu-ld --disable-shared --with-dwarf2 --enable-checking=release
Thread model: single
gcc version 8.0.0 20170718 (experimental) [trunk revision 244001] (GCC)
...
e:/winavr/8.0_2017-07-18/bin/../lib/gcc/avr/8.0.0/../../../../avr/bin/ld.exe:
error: asprintf failed
collect2.exe: error: ld returned 1 exit status
The caller is lto-plugin.c::claim_file_handler()
if (file->offset != 0)
{
char *objname;
/* We pass the offset of the actual file, not the archive header.
Can't use PRIx64, because that's C99, so we have to print the
64-bit hex int as two 32-bit ones. */
int lo, hi, t;
lo = file->offset & 0xffffffff;
hi = ((int64_t)file->offset >> 32) & 0xffffffff;
t = hi ? asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi)
: asprintf (&objname, "%s@0x%x", file->name, lo);
check (t >= 0, LDPL_FATAL, "asprintf failed");
lto_file.name = objname;
}
Presumably, the problem is caused by a broken asprintf host implementation
which returns -1 for a string of length 46. So it would be nice to use a
working implementation like xasprintf from libiberty.
Apart from that, the ordering of lo and hi in
asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi)
looks wrong. The arguments should be "file->name, hi, lo" to get a correct
64-bit value if hi != 0.