[kaffe] Kaffe-gc vs boehm-gc and portability issue with uClibc

Gustavo Guillermo Perez gustavo at compunauta.com
Sun Sep 5 21:45:53 PDT 2004


Hello, I'm building Kaffe CVS on uClibc 0.9.26, (building 1.1.4 on uClibc 
0.9.17 was ok).
boehm-gc has some references to the symbol __libc_stack_end on the files: 
os_dep.c, mach_dep.c, include/private/gcconfig.h 
it seems to be used for Linux x86 on os_dep.c in function:
  ptr_t GC_linux_stack_base(void)
[.....]
    /* First try the easy way.  This should work for glibc 2.2	*/
    /* This fails in a prelinked ("prelink" command) executable */
    /* since the correct value of __libc_stack_end never	*/
    /* becomes visible to us.  The second test works around 	*/
    /* this.							*/  
      if (0 != &__libc_stack_end && 0 != __libc_stack_end ) {
#       ifdef IA64
[.......]
#	endif
      }
    f = open("/proc/self/stat", O_RDONLY);
    if (f < 0 || STAT_READ(f, stat_buf, STAT_BUF_SIZE) < 2 * STAT_SKIP) {
	ABORT("Couldn't read /proc/self/stat");
    }
[.........]
    return (ptr_t)result;
  }
As we see, the "easy way" is privative for uClibc, then I put the "easy way" 
inside a block checking if a macro UCLIBC is not defined, and the above 
definition of __libc_stack_end in the same file, and also put a macro in the 
other relevant files: kaffe/config/i386/linux/md.c, 
kaffe/config/i386/linux/md.h, to not define this symbol if macro UCLIBC is 
defined (I'm only interested on x86). 

Then the build process of kaffe continues, but hangs on the creation of class 
files cause trying to build classes with this error:

Compiling classes from  @all.files  
using  /SRC/kaffecvs/kaffe/kaffe/kaffe/kaffe-bin -verbosegc -ss 500k -mx 256M 
at.dms.kjc.Main
Internal error: caught an unexpected exception.
Please check your CLASSPATH and your installation.
java/lang/UnsatisfiedLinkError: Failed to locate native function:       
gnu/java/nio/channels/FileChannelImpl.init()V
        at 
gnu.java.nio.channels.FileChannelImpl.<clinit>(FileChannelImpl.java:84)
	at java.io.FileDescriptor.<clinit>(FileDescriptor.java:62)
        at java.lang.System.<clinit>(System.java:46)
        at java.lang.ClassLoader.<init>(ClassLoader.java:115)
        at java.lang.ClassLoader.<init>(ClassLoader.java:111)
        at java.security.SecureClassLoader.<init>(SecureClassLoader.java:60)
        at java.net.URLClassLoader.<init>(URLClassLoader.java:544)
        at kaffe.lang.AppClassLoader.<init>(AppClassLoader.java:237)
        at kaffe.lang.AppClassLoader.<clinit>(AppClassLoader.java:35)
./rebuildLib: line 60: 11328 Aborted                 $JAVAC $VERBOSE 
$JAVAC_FLAGS -d $LIBDIR $CPATH ${1+"$@"}
make[3]: *** [lib/stamp] Error 134
make[3]: Leaving directory `/SRC/kaffecvs/kaffe/libraries/javalib'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/SRC/kaffecvs/kaffe/libraries/javalib'
make[1]: *** [kaffe-build-order] Error 2
make[1]: Leaving directory `/SRC/kaffecvs/kaffe'
make: *** [all-recursive] Error 1
-----------------------------------------------------------
As we see there looks like a uClibc problem,  but I'm not sure at all, and I'm 
testing CVS, cause, the old binary build with uClibc 0.9.17 on 0.9.26, fails 
to read propertys from files, Then I have empty "filenames" from reading 
folders.
Looking inside kaffe/libraries/clib/nio/.libs/libnio-1.1.x-cvs.so I see this:
000014b4 T Java_gnu_java_nio_channels_FileChannelImpl_init
00000e6c t _init
Then, I suppose the init function is defined, then may be the LD_LIBRARY_PATH 
should be pointing this library, then I put symlinks on one single folder to 
every native library to export LD_LIBRARY_PATH inside rebuildLib.in
with no effects.

Seeking on kaffe/libraries/clib/nio/FileChannelImpl.c:
Java_gnu_java_nio_channels_FileChannelImpl_init(JNIEnv *env, jclass clazz)
{  
  const char *field_names[3] = { "in", "out", "err" };
  const int field_modes[3] = { 
    gnu_java_nio_channels_FileChannelImpl_READ,
    gnu_java_nio_channels_FileChannelImpl_WRITE, 
    gnu_java_nio_channels_FileChannelImpl_WRITE };
  jfieldID field;
  jmethodID mid = (*env)->GetMethodID(env, clazz, "<init>", "(II)V");
  int i;

  if (mid == NULL)
    return;

  /* Initialize the static fields */
  for (i = 0; i < 3; i++)
  {
    jobject channel;

    field = (*env)->GetStaticFieldID(env, clazz, field_names[i], 
"gnu.java.nio.channels.FileChannelImpl");
    if (field == NULL)
      return;

    channel = (*env)->NewObject(env, clazz, mid, i, field_modes[i]);
    (*env)->SetStaticObjectField(env, clazz, field, channel); 
  }
}

Then, cause I never deal with native functions, I don't know what means the V, 
letter at the end of the inexistent function:
gnu/java/nio/channels/FileChannelImpl.init()V
or the line   jmethodID mid = (*env)->GetMethodID(env, clazz, "<init>", 
"(II)V");

If this V letter should not be appear, then was a memory problem due to my 
tweaked files. I already try before tweaking files --with-gc=kaffe-gc, to 
avoid the use of boehm-gc

I'm feeling completely alone building Kaffe on uClibc, I have just only 5 
years working with Linux, may be I'm doing everything wrong, but if someone 
can point me to still tracing the building problem on uClibc I will 
appreciate it. My configure call looks like this, cause I don't need X, I 
just play with MySQL:
./configure --prefix=/usr/local/kaffe/ --with-gc=kaffe-gc 
--without-kaffe-x-awt --without-kaffe-qt-awt --without-classpath-gtk-awt

Thanks in advance

-- 
-------
Gustavo Guillermo Perez
Compunauta uLinux
www.userver.tk





More information about the kaffe mailing list