gcc-4.7 linking failure: undefined reference to foo

Julian Sikorski belegdol at gmail.com
Tue Jan 10 02:17:51 UTC 2012


W dniu 10.01.2012 02:24, Petr Machata pisze:
> Julian Sikorski <belegdol at gmail.com> writes:
> 
>> I was trying to build mame (an rpmfusion package) with gcc-4.7. I have
>> managed to get it to build, but it fails at the linking stage:
>>
>> obj/sdl/libocore.a(sdlsocket.o): In function `operator new(unsigned long)':
>> /builddir/build/BUILD/mame-0.144u5/src/emu/emualloc.h:114: undefined
>> reference to `malloc_file_line(unsigned long, char const*, int)'
>> obj/sdl/libocore.a(sdlsocket.o): In function `operator delete(void*)':
>> /builddir/build/BUILD/mame-0.144u5/src/emu/emualloc.h:131: undefined
>> reference to `free_file_line(void*, char const*, int)'
>> collect2: error: ld returned 1 exit status
> 
> The problem boils down to the following reproducer:
> 
>     #include <new>
>     #include <cstddef>
> 
>     void *malloc_file_line(size_t size, const char *file, int line);
> 
>     __attribute__((always_inline)) inline void *
>     operator new(std::size_t size) {
>      return malloc_file_line(size, __null, 0);
>     }
> 
>     struct item {
>       void add() { new item; }
>     };
> 
>     int main(int argc, char *argv[]) {
>       return 0;
>     }
> 
> # g++ ble.cc
> /tmp/ccwc7vSd.o: In function `operator new(unsigned long)':
> ble.cc:(.text._Znwm[_Znwm]+0x1e): undefined reference to `malloc_file_line(unsigned long, char const*, int)'
> 
> If #include <new> is removed, the problem goes away.  I suspect there
> might be another declarations of new operator in that header file, and
> the two are not going well together.  Would you be so kind as to open a
> bug against gcc?  It looks like something that responsible parties
> should take a look at, what with all the "inline" and "always_inline"
> stuff that GCC seems to be ignoring.
> 
> To work around your immediate problem, I think you might #define
> NO_MEM_TRACKING before including emu.h, like this:
> 
> diff -up mame-0.144u5/src/osd/sdl/sdlsocket.c\~ mame-0.144u5/src/osd/sdl/sdlsocket.c
> --- mame-0.144u5/src/osd/sdl/sdlsocket.c~	2012-01-10 00:34:48.000000000 +0100
> +++ mame-0.144u5/src/osd/sdl/sdlsocket.c	2012-01-10 02:13:51.293943347 +0100
> @@ -23,6 +23,7 @@
>  #endif
>  #include <errno.h>
>  
> +#define NO_MEM_TRACKING
>  #include "emu.h"
>  #include "sdlfile.h"
> 
> It then proceeds for a bit before hitting a C++11 correctness problem.
> You might consider smuggling in -std=c++98 and alarm upstream, it seems
> GCC 4.7 defaults to C++11 and the code is not ready for this.
> 
> Thanks,
> PM
https://bugzilla.redhat.com/show_bug.cgi?id=772817

Julian



More information about the devel mailing list