MinGW: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
m (Killing "PlusPlus" for "Dev-C++" too (last one ...))
No edit summary
Line 1: Line 1:
'''MinGW''' (Minimalist GNU for Windows) is a port of several GNU utilities to the Windows console environment, including GCC. It is less sophisticated than Cygwin, but more compact and has a lower overhead. It is most widely used in conjunction with the [[Dev-C++]] and CodeBlocks [[:Category:IDEs|IDE]].
'''MinGW''' (Minimalist GNU for Windows) is a port of several GNU utilities to the Windows console environment, including the GCC / binutils toolchain. It is less sophisticated than Cygwin, but more compact with a lower overhead. It is most widely used in conjunction with the [[Dev-C++]] and CodeBlocks [[:Category:IDEs|IDE]].

Note that
* MinGW is a 10+ megabyte download and, like Cygwin, now requires a helper DLL (<tt>MSYS-1.0.DLL</tt>). So it's no longer "minimal".
* MinGW '<tt>make</tt>' uses '<tt>sh</tt>' as the shell if it finds '<tt>sh</tt>' on the path. This is the Wrong Thing. DJGPP '<tt>make</tt>' works better: it looks at the <tt>SHELL</tt> and <tt>COMSPEC</tt> environment variables.


==OSDev==
==OSDev==


Really, you're advised not to use MinGW for OSDeving, but instead to use [[Cygwin]]. MinGW has a collection of issues that make it poorly suited for our needs:
You are encouraged to use [[Cygwin]] instead of MinGW for OSDeving. MinGW has a collection of issues that make it poorly suited for our needs:


# (GCC 2.95) <tt>ld -r -d ...</tt> doesn't get rid of all the common variables.
# (GCC 2.95) <tt>ld -r -d ...</tt> doesn't get rid of all the common variables.
Line 13: Line 9:
# <tt>ld -Ttext=NNN ...</tt> doesn't put the .text section at the correct address unless you also use the --image-base=0 option.
# <tt>ld -Ttext=NNN ...</tt> doesn't put the .text section at the correct address unless you also use the --image-base=0 option.
# Linker claims to support ELF, but says "PE operations on non PE file" if you try to use ELF.
# Linker claims to support ELF, but says "PE operations on non PE file" if you try to use ELF.
# MinGW '<tt>make</tt>' uses '<tt>sh</tt>' as the shell if it finds '<tt>sh</tt>' on the path. This is the Wrong Thing, as the <tt>SHELL</tt> and <tt>COMSPEC</tt> environment variables should be evaluated (like e.g. DJGPP '<tt>make</tt>' does).


But if you write a link script, you'll still be able to make it able to be a Multiboot-kludge compatible kernel. If you are interested you can visit FreeDOS-32 and its kernel can be compiled by MinGW.
It ''is'' possible to create a Multiboot-kludge compatible kernel, though. If you are interested you can visit FreeDOS-32; its kernel can be compiled by MinGW.


<pre>
<pre>

Revision as of 15:16, 8 February 2011

MinGW (Minimalist GNU for Windows) is a port of several GNU utilities to the Windows console environment, including the GCC / binutils toolchain. It is less sophisticated than Cygwin, but more compact with a lower overhead. It is most widely used in conjunction with the Dev-C++ and CodeBlocks IDE.

OSDev

You are encouraged to use Cygwin instead of MinGW for OSDeving. MinGW has a collection of issues that make it poorly suited for our needs:

  1. (GCC 2.95) ld -r -d ... doesn't get rid of all the common variables.
  2. (GCC 2.95) BSS size is stored in the wrong location of the section header, so MinGW does not correctly interoperate with NASM.
  3. ld -Ttext=NNN ... doesn't put the .text section at the correct address unless you also use the --image-base=0 option.
  4. Linker claims to support ELF, but says "PE operations on non PE file" if you try to use ELF.
  5. MinGW 'make' uses 'sh' as the shell if it finds 'sh' on the path. This is the Wrong Thing, as the SHELL and COMSPEC environment variables should be evaluated (like e.g. DJGPP 'make' does).

It is possible to create a Multiboot-kludge compatible kernel, though. If you are interested you can visit FreeDOS-32; its kernel can be compiled by MinGW.

/* The link script
 ( Note: the format should be "pe-i386" instead of
   "pei-i386" to ged rid of the "MZ" header. text
   and data sections should be close to each other. )
*/
OUTPUT_FORMAT("pe-i386")
ENTRY(start)
SECTIONS {
   .text :{
      *(.text)
   }

   .data ADDR(.text) + SIZEOF(.text) :{
      *(.data)
      *(.data2)
      *(.rdata)
      __data_end__ = . ;
   }

   .bss ADDR(.data) + SIZEOF(.data) : {
      *(.bss)
      *(COMMON)
      __bss_end__ = . ;
   }
}

See Also

Articles

Forum

External Links