星期三, 十月 29, 2008

Build Sun CDC1.0.1 in Ubuntu

這個版本(14_May_2002)的JavaME CDC開發環境為Redhat7.1/JDK1.3.1/egcs6,在Ubuntu上有很多水土不服的現象。這份筆記可以給想要考古的人一些參考。


I. source code
j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip
可於http://jtrue.pl/files/GPS/取得
這是我目前可以取得最新版本的Sun官方source code(原因有空再講)

II. Environment
以下分別列出原本的開發環境,與本篇所使用的環境

Redhat7.1 / Ubuntu 6.06
JDK1.3 / JDK1.4 
egcs6 / gcc3.3 and related C develop tool
ksh


III. Troubleshooting

問題一:
This Version's java code is based on JavaSE 1.3.1,JDK6即使使用javac -source 1.4或1.3還是會發生錯誤訊息如下:
../../src/share/classes/java/lang/SecurityManager.java:299: cannot find symbol
symbol : method initCause(java.lang.ClassNotFoundException)
location: class java.lang.NoClassDefFoundError
  synchronized(SecurityManager.class) {
  ^
解法:目前唯一解就是downgrade用JDK1.4或JDK1.3

問題二:GCC4 is restricted for nonstandard C code in this Version

錯誤訊息:
complie time Error:
Checking for test classes to compile ...
... ../../build/linux-i686/obj/globals.o
../../src/share/javavm/runtime/globals.c:121:1: 錯誤: 粘貼「.」和「nullClassLoaderLock」不能給出一個有效的預先處理識別字


解法:需安裝GCC3.3,如果本來是使用有裝GCC4,gcc -V3.3 指定使用V3.3
change line 117 of /cdcfoundation/src/share/javavm/runtime/globals.c from
#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals.##mutex, name}
#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals. mutex, name}
http://blog.csdn.net/huangqiqun/archive/2006/12/18/1447671.aspx

問題三:glibc <2.2 is needed in this Version,會在Linking Time發生錯誤訊息如下:

Linking ../../build/linux-i686/bin/cvm
../../build/linux-i686/obj/UNIXProcess_md.o:在函式「sigchld_handler」中
:../../src/linux/native/java/lang/UNIXProcess_md.c:213: 未定義參考到「
__libc_wait」
collect2: ld 回傳 1
make: *** [../../build/linux-i686/bin/cvm] Error 1

解法:

patch ../../src/linux/native/java/lang/UNIXProcess_md.c
34,53c34

< /* following lines Hacked by Kent Hulick based on
< * ftp://people.redhat.com/drepper/libcwait.c
< * fixes a broken calls to a removed glibc function:*/
< #include
< #include
< pid_t __libc_wait (int *status)
< {
< int res;
< asm volatile ("pushl %%ebx\n\t"
< "movl %2, %%ebx\n\t"
< "movl %1, %%eax\n\t"
< "int $0x80\n\t"
< "popl %%ebx"
< : "=a" (res)
< : "i" (__NR_wait4), "0" (WAIT_ANY), "c" (status), "d" (0),
< "S" (0));
< return res;
< }

--
http://forums.sun.com/thread.jspa?threadID=610934&tstart=555

IV. Preparation&Configure

#sudo su //root
#cd /usr/local/src //anywhere you want to play around
#wget http://jtrue.pl/files/GPS/j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip //download source bundle
#unzip j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip //extracting cdcfoundation-1_0_1-fcs-src.zip and cdcfoundation-1_0_1-fcs-doc.zip
#unzip cdcfoundation-1_0_1-fcs-src.zip //extracting cdcfoundation
#cd cdcfoundation/build

edit following Makefile
#vi ./linux/defs.mk
./linux/defs.mk:#petertc1026
./linux/defs.mk-#CFLAGS_SPEED = -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPEED) $(CPPFLAGS)
./linux/defs.mk-#CFLAGS_SPACE = -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPACE) $(CPPFLAGS)
./linux/defs.mk-#SO_CFLAGS = -c $(SO_CC_ARCH_FLAGS) $(CCFLAGS) $(CPPFLAGS)
./linux/defs.mk-CFLAGS_SPEED = -V3.3 -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPEED) $(CPPFLAGS)
./linux/defs.mk-CFLAGS_SPACE = -V3.3 -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPACE) $(CPPFLAGS)
./linux/defs.mk-SO_CFLAGS = -V3.3 -c $(SO_CC_ARCH_FLAGS) $(CCFLAGS) $(CPPFLAGS)

#vi ./share/defs.mk
./share/defs.mk:#petertc1026
./share/defs.mk-#CVM_GNU_TOOLS_PATH=/micro/tools/i686-redhat-linux/gnu/bin
./share/defs.mk-CVM_GNU_TOOLS_PATH=/usr/bin

patch source code
edit /usr/local/src/cdcfoundation/src/share/javavm/runtime/globals.c:117
//petertc1026
/*#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals.##mutex, name}*/
#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals. mutex, name}

edit /usr/local/src/cdcfoundation/src/linux/native/java/lang/UNIXProcess_md.c:213
34,53c34

< /* following lines Hacked by Kent Hulick based on
< * ftp://people.redhat.com/drepper/libcwait.c
< * fixes a broken calls to a removed glibc function:*/
< #include
< #include
< pid_t __libc_wait (int *status)
< {
< int res;
< asm volatile ("pushl %%ebx\n\t"
< "movl %2, %%ebx\n\t"
< "movl %1, %%eax\n\t"
< "int $0x80\n\t"
< "popl %%ebx"
< : "=a" (res)
< : "i" (__NR_wait4), "0" (WAIT_ANY), "c" (status), "d" (0),
< "S" (0));
< return res;
< }


V. build&demo
#cd linux-i686/
#make CVM_DEBUG=true JAVABIN=/usr/java/j2sdk1.4.2_18/bin
//zzz...
//Done Linking ../../build/linux-i686/bin/cvm!
# bin/cvm -Djava.class.path=testclasses.zip HelloWorld
> GC[SS]: Initialized semi-space gen for generational GC
> Size of *each* semispace in bytes=1048576
> Limits of generation = [0xb7942200,0xb7b42200)
> First semispace = [0xb7942200,0xb7a42200)
> Second semispace = [0xb7a42200,0xb7b42200)
> GC[MC]: Initialized mark-compact gen for generational GC
> Size of the space in bytes=3145728
> Limits of generation = [0xb7b42200,0xb7e42200)
> GC[generational]: Auxiliary data structures
> heapBaseMemoryArea=[0xb7942008,0xb7e42208)
> cardTable=[0x8322f90,0x8325790)
> objectHeaderTable=[0x8325798,0x8327f98)
> summaryTable=[0x8327fa0,0x8331fa0)
> Hello world.

0 意見: