El mar, 27-01-2009 a las 18:21 +0100, Christian Franke escribió: > Javier Martín wrote: > >> Unfortunately, gcc has no '-fno_os' option to specify the bare CPU as > >> target. > >> > > > > Might -ffreestanding be what you are looking for? > > > > > > The option '-ffreestanding' is the same as '-fno-hosted'. > > According to gcc (4.3.1) source, '-fno-hosted' clears variable > 'flag_hosted' and sets '-fno-builtin'. The latter is already set within > GRUB build. > > A cleared 'flag_hosted' apparently has only 2 effects: > - disable the special handling of 'main()'. > - #define __STDC_HOSTED__ to 0 instead of 1 > > There is no effect on the target_os dependent parts of the gcc code > generation. For example, on i386, __enable_execute_stack() calls are > generated for target_os netbsd, openbsd and cygwin, but not for linux. > The emit call is hard-coded in > gcc/configs/i386/i386.c:x86_initialize_trampoline().
In that case, we are dealing with a GCC bug. We might want to require the user to create a bare "no-OS" cross compiler. These thingies are most likely only known to OS developers, but you can build a perfectly good "i686-pc-elf" GCC (only with no libc, of course). This might be the Right Way (TM) of building boot code, instead of the current way of using the OS-targetter compiler and trying to tell it not to do what it was built to do. > > Other workarounds are needed to support building GRUB with code > generators tailored for various target_os. > > > >> > >>> AC_MSG_CHECKING([for command to convert module to ELF format]) > >>> -case "${host_os}:${target_os}" in > >>> - cygwin:cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;; > >>> +case "${host_os}" in > >>> + cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;; > >>> *) ;; > >>> esac > >>> > >>> > >> This won't work for a Linux cross compiler hosted on Cygwin. It would > >> emit ELF format and does not need pe2elf. > >> > > > > A, say, AMD64 Linux cross compiler hosted on x86 Cygwin would have > > $build=i686-pc-cygwin and $host=amd64-linux-gnu. Thus, no conflict ought > > to arise even with cross compilation enabled. > > > > > > But the opposite won't work: $host=i686-pc-cygwin would enable > grub-pe2elf, even if this gcc emits ELF for a linux target. "The opposite" of a the described situation would be a Linux AMD64 machine cross compiling for a Cygwin x86 machine, that is $build=amd64-linux-gnu and $host=i686-pc-cygwin. In that case, i686-pc-cygwin-gcc would generate PE executables, and thus grub-pe2elf _is_ required indeed. > > Christian > > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel
signature.asc
Description: Esta parte del mensaje está firmada digitalmente
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel