http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59236
Bug ID: 59236
Summary: Mixing -O0 and -O2 object causes link error because of
corrupted comadts
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: rafael.espindola at gmail dot com
Target: mingw
$ cat test1.cpp
#include "test.h"
struct zed : public foo {
virtual ~zed();
};
zed::~zed() {}
$ cat test2.cpp
#include "test.h"
struct zed2 : public foo {
virtual ~zed2();
};
zed2::~zed2() {}
$ cat test.h
class foo {
virtual void bar() { __builtin_unreachable(); }
};
$ i686-w64-mingw32-g++ -fno-rtti -fno-exceptions -c test1.cpp
$ i686-w64-mingw32-g++ -fno-rtti -fno-exceptions -c test2.cpp -O2
$ i686-w64-mingw32-g++ -fno-rtti -fno-exceptions test1.o test2.o -o t.so
-shared
test2.o:test2.cpp:(.text$_ZN3foo3barEv+0x0): multiple definition of
`foo::bar()'
test1.o:test1.cpp:(.text$_ZN3foo3barEv[__ZN3foo3barEv]+0x0): first defined here
collect2: error: ld returned 1 exit status
The problem seems to be that test1.o has
3 .text$_ZN3foo3barEv 0000000c 00000000 00000000 0000014c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE, LINK_ONCE_DISCARD
(COMDAT __ZN3foo3barEv 4)
while test2.o has
4 .text$_ZN3foo3barEv 00000000 00000000 00000000 00000000 2**4
ALLOC, LOAD, READONLY, CODE, LINK_ONCE_DISCARD
noticed that the comdat symbol is missing.