[Solved] Re: How to build userland ?

BERTRAND Joel <[email protected]> Fri, 01 Oct 2010 18:43:52 +0200
Newsgroups gmane.comp.micro-kernel.l4.l4ka.general
Message-ID <[email protected]>
BERTRAND Joel a écrit :
> Hello,
>
> I'm trying to play woth L4ka. My compiler is :
>
> cauchy:[~/openvms/root/build] > g++ -v
> Using built-in specs.
> Target: x86_64-linux-gnu
> Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.4-8'
> --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
> --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
> --enable-shared --enable-multiarch --enable-linker-build-id
> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
> --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4
> --program-suffix=-4.4 --enable-nls --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586
> --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> Thread model: posix
> gcc version 4.4.5 20100728 (prerelease) (Debian 4.4.4-8)
>
> I can build L4 kernel without any trouble but not userland. Process
> hangs with following error :
>
> gcc -x c++ -I/home/bertrand/openvms/root/sources/kernel/include -I../..
> -I/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include
> -I/home/bertrand/openvms/root/sources/kernel/lib/io
> -I/home/bertrand/openvms/root/sources/kernel/util/kickstart -DALSO_ELF64
> -DALSO_BOOTINFO64 -fno-stack-protector -nostdinc -mtune=core2 -O2 -g
> -Wall -Wshadow -Wconversion -Wno-conversion -fno-builtin
> -DREVISION="`cat .revision`" -O2 -fno-exceptions -c
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/elf.cc -o elf.o
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/elf.cc: In
> function ‘bool elf_find_sections(L4_Word_t, BI64::L4_Boot_SimpleExec_t*)’:
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/elf.cc:401:
> error: redefinition of ‘bool elf_find_sections(L4_Word_t,
> BI64::L4_Boot_SimpleExec_t*)’
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/elf.cc:365:
> error: ‘bool elf_find_sections(L4_Word_t, BI64::L4_Boot_SimpleExec_t*)’
> previously defined here
>
> If I understand, BI_NS and BI_NS2 are defined with same value : BI64.
> Thus, elf_find_sections() function is defined _twice_. I have no idea to
> fix this trouble. If I comment the second declaration of this function,
> build process hangs later with :
>
> ===> Linking util/kickstart/kickstart
> ld -e_start -N -L../../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5
> -nostdlib -N -L. -Ttext=00100000
> -L/home/bertrand/openvms/root/sources/kernel/util/kickstart
> -Tkickstart.ld elf64.o bootinfo64.o crt0-amd64.o kickstart.o kipmgr.o
> elf.o lib.o bootinfo.o amd64.o mbi.o mbi-amd64.o mbi-loader.o -lio32 -o
> kickstart
> elf.o: In function `elf_load64(unsigned long, unsigned long, unsigned
> long*, unsigned long*, unsigned long*, bool (*)(unsigned long, unsigned
> long))':
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/elf.cc:73:
> multiple definition of `elf_load64(unsigned long, unsigned long,
> unsigned long*, unsigned long*, unsigned long*, bool (*)(unsigned long,
> unsigned long))'
> elf64.o:/home/bertrand/openvms/root/sources/kernel/util/kickstart/elf.cc:73:
> first defined here
> bootinfo.o: In function `BI64::init_bootinfo(BI64::L4_BootInfo_t*)':
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/bootinfo.cc:66: multiple
> definition of `BI64::init_bootinfo(BI64::L4_BootInfo_t*)'
> bootinfo64.o:/home/bertrand/openvms/root/sources/kernel/util/kickstart/bootinfo.cc:66:
> first defined here
> bootinfo.o: In function `BI64::record_bootinfo_mbi(BI64::L4_BootInfo_t*,
> BI64::L4_BootRec_t*, mbi_t*)':
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/bootinfo.cc:169:
> multiple definition of `BI64::record_bootinfo_mbi(BI64::L4_BootInfo_t*,
> BI64::L4_BootRec_t*, mbi_t*)'
> bootinfo64.o:/home/bertrand/openvms/root/sources/kernel/util/kickstart/bootinfo.cc:169:
> first defined here
> bootinfo.o: In function
> `BI64::record_bootinfo_modules(BI64::L4_BootInfo_t*,
> BI64::L4_BootRec_t*, mbi_t*, mbi_module_t*, unsigned int)':
> /home/bertrand/openvms/root/sources/kernel/util/kickstart/bootinfo.cc:96: multiple
> definition of `BI64::record_bootinfo_modules(BI64::L4_BootInfo_t*,
> BI64::L4_BootRec_t*, mbi_t*, mbi_module_t*, unsigned int)'
> bootinfo64.o:/home/bertrand/openvms/root/sources/kernel/util/kickstart/bootinfo.cc:96:
> first defined here
> make[3]: *** [kickstart] Erreur 1
> make[3]: quittant le répertoire «
> /home/bertrand/openvms/root/build/kernel/util/kickstart »
> make[2]: *** [subdirs-all] Erreur 2
> make[2]: quittant le répertoire «
> /home/bertrand/openvms/root/build/kernel/util »
> make[1]: *** [subdirs-all] Erreur 2
> make[1]: quittant le répertoire «
> /home/bertrand/openvms/root/build/kernel »
> make: *** [freevms] Erreur 2
>
> In user/util/kickstart/Makefile.in, I have change LDFLAGS_amd64 as
> original Makefile tries to link 32 bits objects with 64 bits libraries.
>
> # JKB
> #LDFLAGS_amd64= -b elf32-i386 --oformat elf32-i386 \
> # -N -m elf_i386 -L.
> LDFLAGS_amd64= -N -L.

	It was a very bad idea. Good fix is :

#Modifications JKB 20101001
#CFLAGS_kickstart_amd64:=$(patsubst -m64, -m32, $(CFLAGS)) -O2
CFLAGS_kickstart_amd64:=$(patsubst -m64, -m32, $(CFLAGS)) -O2 -m32
CPPFLAGS_amd64=     -I$(top_srcdir)/lib/io -I$(srcdir) \
             -DALSO_ELF64 -DALSO_BOOTINFO64
LDFLAGS_amd64=      -b elf32-i386 --oformat elf32-i386 \
             -N -m elf_i386 -L.
IO32FILES_amd64=    get_hex.cc print.cc $(ARCH).cc
PROGRAM_DEPS_amd64= $(top_builddir)/util/kickstart/libio32.a

	This bug only occurs on amd64.

	Regards,

	JKB