gcj static crosscompiling raises issues with boehm-gc

David Daney ddaney@caviumnetworks.com
Wed Oct 6 17:07:00 GMT 2010


On 10/06/2010 09:53 AM, Andreas Frisch wrote:
> Am Mittwoch, 6. Oktober 2010, um 08:51:40 schrieb David Daney:
>> On 10/06/2010 07:25 AM, Andrew Haley wrote:
>>> On 10/06/2010 09:43 AM, Andreas Frisch wrote:
>>>> hi gcj experts,
>>>>
>>>> i've spent some time already trying to statically cross compile a java
>>>> source for an embedded mipsel architecture. i'm using openembedded
>>>> and gcc-4.4.4 with the latest java part imported from master
>>>>
>>>> in the makefile, i am using the command
>>>>
>>>> $(CROSS_COMPILE)gcj $(JFLAGS) $(SOURCES) \
>>>>
>>>> 		-static-libgcj \
>>>> 		-fjni \
>>>> 		-g \
>>>> 		-o dumphd-mipsel-static \
>>>> 		
>>>> 		 --main=dumphd.core.DumpHD \
>>>> 		
>>>> 		-nostdlib \
>>>> 		-L/dream/oe1.6/dm8000/build/tmp/staging/mipsel-oe-linux/usr/lib
> \
>>>> 		-L/dream/projects/bluray/aacskeys-0.4.0c-mipsel/lib/linux/ \
>>>> 		-Wl,-rpath-link,/dream/oe1.6/dm8000/build/tmp/staging/mipsel-oe-
>>>>
>>>> linux/usr/lib \
>>>>
>>>> 		-Wl,-rpath-link,/dream/projects/bluray/aacskeys-0.4.0c-
>>>>
>>>> mipsel/lib/linux/ -laacskeys \
>>>>
>>>> 		-shared-libgcc -Wl,-non_shared -lgcj -Wl,-call_shared -lstdc++ -
>>>>
>>>> Wl,--as-needed -lgcc_s -lpthread -lc -lm -ldl -lrt -Wl,--no-as-needed
>>>> -Wl,-O1
>>>>
>>>> this may contain a lot of redundancies or look silly in many ways but
>>>> for right now i just aggregated as much as possible in there from
>>>> what i could find online.
>>>>
>>>> i've also set
>>>> CLASSPATH=/dream/oe1.6/dm8000/build/tmp/cross/mipsel/bin/ecj.jar:./
>>>>
>>>> when i run make, linking fails:
>>>>
>>>> /dream/oe1.6/dm8000/build/tmp/cross/mipsel/lib/gcc/mipsel-oe-
>>>> linux/4.4.4/../../../../mipsel-oe-linux/bin/ld: warning: cannot find
>>>> entry symbol __start; defaulting to 00000000004084b0
>>>> /dream/oe1.6/dm8000/build/tmp/cross/mipsel/lib/gcc/mipsel-oe-
>>>> linux/4.4.4/../../../../mipsel-oe-linux/lib/libgcj.a(dyn_load.o): In
>>>> function `GC_register_dynamic_libraries_dl_iterate_phdr':
>>>> /dream/oe1.6/dm8000/build/tmp/work/mipsel-oe-linux/gcc-cross-4.4.4-
>>>> r0.1/gcc-4.4.4/boehm-gc/dyn_load.c:454: undefined reference to
>>>> `__data_start'
>>>> /dream/oe1.6/dm8000/build/tmp/cross/mipsel/lib/gcc/mipsel-oe-
>>>> linux/4.4.4/../../../../mipsel-oe-linux/lib/libgcj.a(os_dep.o): In
>>>> function `GC_register_data_segments':
>>>> /dream/oe1.6/dm8000/build/tmp/work/mipsel-oe-linux/gcc-cross-4.4.4-
>>>> r0.1/gcc-4.4.4/boehm-gc/os_dep.c:1450: undefined reference to
>>>> `__data_start' collect2: ld returned 1 exit status
>>>> make: *** [dumphd-static-new] Error 1
>>>>
>>>> i'd be grateful for any suggestions or hints.
>>>
>>> This looks completely broken: it seems to be trying to statically link
>>> against libgcj.  Try it without -non_shared.
>>
>> To expound on this, the '-static-libgcj' option was created so that all
>> the other things you have there would be unneeded.
>>
>> I doubt you want any of: -shared-libgcc -Wl,-non_shared -lgcj
>> -Wl,-call_shared -lstdc++ -Wl,--as-needed -lgcc_s -lpthread -lc -lm -ldl
>> -lrt -Wl,--no-as-needed -Wl,-O1
>>
>>
>> Start off with -static-libgcj on a very simple 'hello-world' type
>> program.  Then start adding all your other things in.
>>
>> David Daney
>
> hi david!
>
> actually i was already successful statically cross compiling java programs as
> complex as projectx:
>
> it works both the traditional way
> projectx-static-oldfashioned: $(OBJS)
> 	$(CROSS_COMPILE)gcj $(JFLAGS) -c -o ac3.o --resource ac3.bin
> ../resources/ac3.bin
> 	$(CROSS_COMPILE)gcj $(JFLAGS) -c -o pjxresources_en.o --resource
> pjxresources_en.properties ../resources/pjxresources_en.properties
> 	$(CROSS_COMPILE)gcj $(JFLAGS) $(OBJS) pjxresources_en.o ac3.o -
> Djava.awt.headless=true --main=net.sourceforge.dvb.projectx.common.Start -
> save-temps
> 	$(CROSS_COMPILE)gcc -o projectx $(OBJS) pjxresources_en.o ac3.o
> ./net.sourceforge.dvb.projectx.common.Startmain.i \
> 	-shared-libgcc -Wl,-non_shared -lgcj -Wl,-call_shared -lsupc++ -Wl,--as-
> needed -lgcc_s -lpthread -lc -lm -ldl -lrt -Wl,--no-as-needed
> 	$(CROSS_COMPILE)strip --strip-all projectx
>
> and with the new nifty -static-libgcj convenience parameter
> projectx-static:
> 	$(CROSS_COMPILE)gcj $(JFLAGS) -c -o ac3.o --resource ac3.bin
> ../resources/ac3.bin
> 	$(CROSS_COMPILE)gcj $(JFLAGS) -c -o pjxresources_en.o --resource
> pjxresources_en.properties ../resources/pjxresources_en.properties
> 	$(CROSS_COMPILE)gcj -static-libgcj -o projectx $(SOURCES)
> pjxresources_en.o ac3.o \
> 	-Djava.awt.headless=true --main=net.sourceforge.dvb.projectx.common.Start
> 	$(CROSS_COMPILE)strip --strip-all projectx
>
> however, what's different about this new program is that it requires that c++
> compiled shared object libaacskeys.so and that's what causes my problems i
> guess
>

Things can get complicated when linking in C++ code with the gcj driver 
program.  I would think all you would need is -lsupc++, and perhaps 
-lstdc++.

-nostdlib looks a bit questionable to me.

In any event it is good to see that people are still making use of gcj 
on mips.

David Daney



More information about the Java mailing list