The following code will not link because j.getName has multiple definitions.
Both j.o and natj.o contain a T definition when natj.o should contain a W def.
Ultimatly this causes the mingw 4.0.0 cross compiler to not build a functioning
native compiler becuase libgcj.a contains multiple defintion.
[EMAIL PROTECTED] steve]$ cat j.java
class j
{
String _name;
j() {
_name="BOB";
}
String getName() {
return _name;
};
}
#pragma implementation "j.h"
#include "j.h"
#include <java/lang/Object.h>
#include <gcj/cni.h>
int main(int argc,char** argv)
{
j *bob=new j();
bob->getName();
return 0;
}
gcjh j creates j.h
$ cat j.h
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-
#ifndef __j__
#define __j__
#pragma interface
#include <java/lang/Object.h>
extern "Java"
{
class j;
}
class j : public ::java::lang::Object
{
public: // actually package-private
j ();
virtual ::java::lang::String *getName () { return _name; }
::java::lang::String * __attribute__((aligned(__alignof__(
::java::lang::Object )))) _name;
public:
static ::java::lang::Class class$;
};
#endif /* __j__ */
$ nm j.o
00000000 b .bss
00000000 d .ctors
00000000 d .data
00000000 r .rdata
00000000 N .stab
00000000 N .stabstr
00000000 t .text
00000094 d __catch_classes_j
00000088 d __CD_j
00000090 d __CT_j
00000000 d __FL_j
00000030 t __GLOBAL__I_0__ZN1jC1Ev
U __Jv_RegisterClass
00000020 d __MT_j
00000000 r __Utf1
0000000a r __Utf2
00000016 r __Utf3
0000001e r __Utf4
0000002a r __Utf5
00000044 r __Utf6
0000004c r __Utf7
000000c0 D __ZN1j6class$E
00000024 T __ZN1j7getNameEv
00000000 T __ZN1jC1Ev
U __ZN4java4lang6Object5cloneEv
U __ZN4java4lang6Object6class$E
U __ZN4java4lang6Object6equalsEPS1_
U __ZN4java4lang6Object8finalizeEv
U __ZN4java4lang6Object8hashCodeEv
U __ZN4java4lang6Object8toStringEv
U __ZN4java4lang6ObjectC1Ev
U __ZN4java4lang6String6class$E
00000060 D __ZTVN1jE
U __ZTVN4java4lang5ClassE
$ nm natj.o
00000000 b .bss
00000000 d .data
00000000 r .rdata$_ZTI15_JvObjectPrefix
00000000 r .rdata$_ZTI1j
00000000 r .rdata$_ZTIN4java4lang6ObjectE
00000000 r .rdata$_ZTS15_JvObjectPrefix
00000000 r .rdata$_ZTS1j
00000000 r .rdata$_ZTSN4java4lang6ObjectE
00000000 t .text
00000000 t .text$_ZN1j7getNameEv
U ___main
U __alloca
U __Jv_AllocObject
U __ZN1j6class$E
00000000 T __ZN1j7getNameEv
U __ZN1jC1Ev
00000000 R __ZTI15_JvObjectPrefix
00000000 R __ZTI1j
00000000 R __ZTIN4java4lang6ObjectE
00000000 R __ZTS15_JvObjectPrefix
00000000 R __ZTS1j
00000000 R __ZTSN4java4lang6ObjectE
U __ZTVN10__cxxabiv117__class_type_infoE
U __ZTVN10__cxxabiv120__si_class_type_infoE
00000000 T _main
--
Summary: GCC/GCJ not creating proper symbols for inline native
CNI code
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: steve at netfuel dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i386-mingw32msvc
GCC host triplet: i386-mingw32msvc
GCC target triplet: i386-mingw32msvc
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20993