This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Re: JNI on ARM/XScale
- From: Jari Korva <jpkorva at iki dot fi>
- To: Bryce McKinlay <mckinlay at redhat dot com>
- Cc: java at gcc dot gnu dot org
- Date: Wed, 6 Oct 2004 13:57:46 +0300 (EEST)
- Subject: Re: JNI on ARM/XScale
- References: <Pine.GSO.4.58.0409161036260.8826@paju.oulu.fi> <41583439.10701@redhat.com><Pine.GSO.4.58.0409301619430.28882@paju.oulu.fi> <415C2B80.2040803@redhat.com>
On Thu, 30 Sep 2004, Bryce McKinlay wrote:
> Hmm, so if you printf() lib_name immediately before and after the
> JvSynchronize(), it prints the correct value before the call and
> corrupted afterwards? If so, that sounds like a C++ compiler bug, as a
> value on the stack is somehow being overwritten.
>
> You could try building natRuntime.cc with -O0 to confirm this theory.
Thanks again! I removed -O2 from libjava/Makefile, touched natRuntime.cc
and ran make again. Then I rebuild my JNI-HelloWorld - and it really
worked!
I also tried printfs instead of debugger on -O2 optimized binary. That
way, it seems that the value is corrupted already before JvSynchronize.
The trace and modified source are below (the most bizarre thing is that it
jumps directly from trace 3-1 to 4).
...
JKO DEBUG 3-1: libhello
JKO DEBUG 3-2: libhello
JKO DEBUG 3-3: libhello
JKO DEBUG 3-1: libhello
JKO DEBUG 4:
...
try
{
for (int i = 0; i < 10; ++i)
{
printf("JKO DEBUG 3-1: %s\n", lib_name);
jclass klass = t->classAt(i);
printf("JKO DEBUG 3-2: %s\n", lib_name);
if (klass != NULL)
{
printf("JKO DEBUG 3-2-1: %s\n", lib_name);
ClassLoader *loader = klass->getClassLoaderInternal();
printf("JKO DEBUG 3-2-2: %s\n", lib_name);
if (loader != NULL && loader != sys)
{
look = loader;
break;
}
}
printf("JKO DEBUG 3-3: %s\n", lib_name);
}
}
catch (::java::lang::ArrayIndexOutOfBoundsException *e)
{
}
printf("JKO DEBUG 4: %s\n", lib_name);
- Jari