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

Reply via email to