Date: Tue, 18 Mar 2008 17:15:25 +1100 From: Peter Jeremy <peterjeremy@optushome.com.au> To: Greg Lewis <glewis@eyesbeyond.com> Cc: freebsd-java@freebsd.org Subject: Re: jdk15/javaws on amd64 Message-ID: <20080318061525.GQ44676@server.vk2pj.dyndns.org> In-Reply-To: <20080317133144.GA4473@misty.eyesbeyond.com> References: <20080316223054.GA46447@server.vk2pj.dyndns.org> <20080317133144.GA4473@misty.eyesbeyond.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--f+W+jCU1fRNres8c
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
On Mon, Mar 17, 2008 at 06:31:44AM -0700, Greg Lewis wrote:
>On Mon, Mar 17, 2008 at 09:30:54AM +1100, Peter Jeremy wrote:
>> 75310 java CALL stat(0x7fffffffd250,0x7fffffffd6f0)
>> 75310 java NAMI "<8B>H<83>[]?1?H<83>[]?AUATUSH<83>H<89>?H<8B>^E?^M=
^R/deploy.jar"
>> 75310 java RET stat -1 errno 2 No such file or directory
>
>That certainly is an interesting path for deploy.jar...
>
>The path to deploy.jar is set up in deploy/src/javaws/share/native/launche=
r.c,
>so thats probably a good place to start.
I've done some poking at it with both some printf()s and gdb and it
appears to be a gcc bug - in fact, I'm surprised it works at all...
The relevant function is GetBootClassPath():
char* GetBootClassPath(void) {
static char bootclasspath[MAXPATHLEN];
#ifdef _DEBUG
sprintf(bootclasspath, "%s%c%s%c%s%c%s",=20
sysGetJarLib(), FILE_SEPARATOR, "javaws_g.jar",
PATH_SEPARATOR, sysGetJarLib(), FILE_SEPARATOR, "deploy_g.j=
ar");
#else
sprintf(bootclasspath, "%s%c%s%c%s%c%s",=20
sysGetJarLib(), FILE_SEPARATOR, "javaws.jar",
PATH_SEPARATOR, sysGetJarLib(), FILE_SEPARATOR, "deploy.jar=
");
#endif
return bootclasspath;
}
Within the jdk build, launcher.c is compiled with:
/usr/bin/gcc -I../../src/javaws/share/native -I../../src/javaws/solaris/na=
tive -I../../src/javaws/share/native/jpeg -I/home/obj/usr/ports/java/jdk15/=
work/control/build/bsd-amd64/tmp/deploy/javaws/jawsgensrc/headers -I/usr/lo=
cal/include -I/usr/local/include -D_ALLBSD_SOURCE ../../src/javaws/share/n=
ative/launcher.c -c -o /home/obj/usr/ports/java/jdk15/work/control/build/bs=
d-amd64/tmp/deploy/javaws/jawsobj/launcher.o
The second sysGetJarLib() is passed to sprintf() as the first memory
operand (ie (%rsp)) but for reasons known best to gcc, only a 32-bit
move is used, leaving the high 32-bits alone. In my case, when
sprintf() accesses the 64-bit value it winds up with an arbitrary address
inside one of the dynamic libraries.
I've tried building a simple test using:
cc -O2 -fno-strict-aliasing -pipe -march=3Dnocona -DDMEM foo.c -o foo
and the code is compiled correctly (actually, the generated code is
basically identical except it correctly uses 64-bit moves). I'm still
investigating what has gone wrong.
Out of interest, why isn't jdk15 being built using the default CFLAGS?
--=20
Peter Jeremy
Please excuse any delays as the result of my ISP's inability to implement
an MTA that is either RFC2821-compliant or matches their claimed behaviour.
--f+W+jCU1fRNres8c
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.8 (FreeBSD)
iEYEARECAAYFAkffXf0ACgkQ/opHv/APuIcKagCglYhDmgQF1VnvjvjLusLJkrrz
urYAnREoTSqiI66c3Y644BR3lHqHZF4u
=dGjN
-----END PGP SIGNATURE-----
--f+W+jCU1fRNres8c--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080318061525.GQ44676>
