Make i386-* other than i386-pc compileable under cygwin.
authorVladimir Serbinenko <phcoder@gmail.com>
Sat, 14 Dec 2013 22:12:53 +0000 (23:12 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Sat, 14 Dec 2013 22:12:53 +0000 (23:12 +0100)
ChangeLog
conf/Makefile.common
conf/i386-cygwin-img-ld.sc [moved from conf/i386-pc-cygwin-img-ld.sc with 91% similarity]
configure.ac
gentpl.py
grub-core/Makefile.core.def
util/grub-pe2elf.c

index d28ca02..9178e03 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-12-14  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Make i386-* other than i386-pc compileable under cygwin.
+
 2013-12-14  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Fix definition of grub_efi_hard_drive_device_path. Take care that
index d6da66c..de55c9a 100644 (file)
@@ -48,11 +48,7 @@ CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
 LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) $(TARGET_LDFLAGS_STATIC_LIBGCC)
 CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1
 CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
-if COND_CYGWIN
-STRIPFLAGS_KERNEL = -F elf32-i386 -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version
-else
-STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .note.gnu.gold-version
-endif
+STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version
 
 CFLAGS_MODULE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
 LDFLAGS_MODULE = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r,-d
similarity index 91%
rename from conf/i386-pc-cygwin-img-ld.sc
rename to conf/i386-cygwin-img-ld.sc
index 90866c3..3ac26fc 100644 (file)
@@ -5,6 +5,8 @@ SECTIONS
   .text :
   {
     start = . ;
+    _start = . ;
+    __start = . ;
     *(.text)
     etext = . ;
   }
@@ -33,6 +35,8 @@ SECTIONS
   {
     *(.edata)
     end = . ;
+    _end = . ;
+    __end = . ;
   }
   .stab :
   {
index 0abbb99..a4058a2 100644 (file)
@@ -704,7 +704,7 @@ AC_ARG_ENABLE([efiemu],
 if test x"$enable_efiemu" = xno ; then
   efiemu_excuse="explicitly disabled"
 fi
-if test x"$target_os" = xcygwin ; then
+if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then
   efiemu_excuse="not available on cygwin"
 fi
 if test x"$target_cpu" != xi386 ; then
@@ -806,12 +806,12 @@ if test x$grub_cv_target_cc_link_format = x-arch,i386 || test x$grub_cv_target_c
    TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
    TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
    TARGET_LDFLAGS_OLDMAGIC=""
-elif test x$grub_cv_target_cc_link_format = x-mi386pe && test x$platform = xpc; then
+elif test x$grub_cv_target_cc_link_format = x-mi386pe; then
   TARGET_APPLE_LINKER=0
   TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
-  TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-pc-cygwin-img-ld.sc"
+  TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
   TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
-  TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-pc-cygwin-img-ld.sc"
+  TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-cygwin-img-ld.sc"
   TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
   TARGET_IMG_CFLAGS=
 else
@@ -1563,7 +1563,6 @@ AC_SUBST(TARGET_LDFLAGS)
 AC_SUBST(TARGET_CPPFLAGS)
 AC_SUBST(TARGET_CCASFLAGS)
 
-AC_SUBST(TARGET_IMG_LDSCRIPT)
 AC_SUBST(TARGET_IMG_LDFLAGS)
 AC_SUBST(TARGET_IMG_CFLAGS)
 AC_SUBST(TARGET_IMG_BASE_LDOPT)
@@ -1636,7 +1635,6 @@ AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
 AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
 
 AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1])
-AM_CONDITIONAL([COND_CYGWIN], [test x$target_os = xcygwin])
 AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x])
 AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy])
 
index 02bf335..bdcae1a 100644 (file)
--- a/gentpl.py
+++ b/gentpl.py
@@ -718,11 +718,14 @@ def kernel(defn, platform):
 """if test x$(TARGET_APPLE_LINKER) = x1; then \
      $(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -wd1106 -nu -nd $< $@; \
    elif test ! -z '$(TARGET_OBJ2ELF)'; then \
-     cp $< $@.bin; $(TARGET_OBJ2ELF) $@.bin && cp $@.bin $@ || (rm -f $@.bin; exit 1); \
+     $(TARGET_OBJ2ELF) $< $@ || (rm -f $@; exit 1); \
    else cp $< $@; fi""",
 """if test x$(TARGET_APPLE_LINKER) = x1; then \
   $(TARGET_STRIP) -S -x $(""" + cname(defn) + """) -o $@.bin $<; \
   $(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -ed2016 -wd1106 -nu -nd $@.bin $@; \
+   elif test ! -z '$(TARGET_OBJ2ELF)'; then \
+     """  + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@.bin $< && \
+     $(TARGET_OBJ2ELF) $@.bin $@ || (rm -f $@; rm -f $@.bin; exit 1); \
 else """  + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@ $<; \
 fi"""))
 
index 060de44..a550032 100644 (file)
@@ -59,9 +59,7 @@ kernel = {
   ia64_efi_ldflags = '-Wl,-r,-d';
   ia64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
 
-  x86_64_xen_ldflags       = '-Wl,-Ttext=0';
   x86_64_xen_cppflags     = '$(CPPFLAGS_XEN)';
-  i386_xen_ldflags       = '-Wl,-Ttext=0';
   i386_xen_cppflags       = '$(CPPFLAGS_XEN)';
 
   arm_efi_ldflags          = '-Wl,-r,-d';
@@ -72,15 +70,21 @@ kernel = {
 
   i386_pc_ldflags          = '$(TARGET_IMG_LDFLAGS)';
   i386_pc_ldflags          = '$(TARGET_IMG_BASE_LDOPT),0x9000';
-
   i386_qemu_ldflags        = '$(TARGET_IMG_LDFLAGS)';
   i386_qemu_ldflags        = '$(TARGET_IMG_BASE_LDOPT),0x8200';
+  i386_coreboot_ldflags    = '$(TARGET_IMG_LDFLAGS)';
+  i386_coreboot_ldflags    = '$(TARGET_IMG_BASE_LDOPT),0x8200';
+  i386_multiboot_ldflags   = '$(TARGET_IMG_LDFLAGS)';
+  i386_multiboot_ldflags   = '$(TARGET_IMG_BASE_LDOPT),0x8200';
+  i386_ieee1275_ldflags    = '$(TARGET_IMG_LDFLAGS)';
+  i386_ieee1275_ldflags    = '$(TARGET_IMG_BASE_LDOPT),0x10000';
+  i386_xen_ldflags         = '$(TARGET_IMG_LDFLAGS)';
+  i386_xen_ldflags         = '$(TARGET_IMG_BASE_LDOPT),0';
+  x86_64_xen_ldflags       = '$(TARGET_IMG_LDFLAGS)';
+  x86_64_xen_ldflags       = '$(TARGET_IMG_BASE_LDOPT),0';
 
   ldadd = '$(LDADD_KERNEL)';
 
-  i386_coreboot_ldflags    = '-Wl,-Ttext=0x8200';
-  i386_multiboot_ldflags   = '-Wl,-Ttext=0x8200';
-  i386_ieee1275_ldflags    = '-Wl,-Ttext=0x10000';
   mips_loongson_ldflags    = '-Wl,-Ttext,0x80200000';
   powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
   sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
index 44189c1..131410f 100644 (file)
@@ -71,7 +71,7 @@ static int strtab_max, strtab_len;
 static Elf32_Ehdr ehdr;
 static Elf32_Shdr shdr[MAX_SECTIONS];
 static int num_sections;
-static grub_uint32_t offset;
+static grub_uint32_t offset, image_base;
 
 static int
 insert_string (const char *name)
@@ -112,6 +112,7 @@ write_section_data (FILE* fp, const char *name, char *image,
     {
       grub_uint32_t idx;
       const char *shname = pe_shdr->name;
+      grub_size_t secsize;
 
       if (shname[0] == '/' && grub_isdigit (shname[1]))
       {
@@ -121,6 +122,8 @@ write_section_data (FILE* fp, const char *name, char *image,
         shname = pe_strtab + atoi (t + 1);
       }
 
+      secsize = pe_shdr->raw_data_size;
+
       if (! strcmp (shname, ".text"))
         {
           idx = TEXT_SECTION;
@@ -155,11 +158,16 @@ write_section_data (FILE* fp, const char *name, char *image,
 
       section_map[i + 1] = idx;
 
+      if (pe_shdr->virtual_size
+         && pe_shdr->virtual_size < secsize)
+       secsize = pe_shdr->virtual_size;
+
       shdr[idx].sh_type = (idx == BSS_SECTION) ? SHT_NOBITS : SHT_PROGBITS;
-      shdr[idx].sh_size = pe_shdr->raw_data_size;
+      shdr[idx].sh_size = secsize;
       shdr[idx].sh_addralign = 1 << (((pe_shdr->characteristics >>
                                        GRUB_PE32_SCN_ALIGN_SHIFT) &
                                       GRUB_PE32_SCN_ALIGN_MASK) - 1);
+      shdr[idx].sh_addr = pe_shdr->virtual_address + image_base;
 
       if (idx != BSS_SECTION)
         {
@@ -168,7 +176,7 @@ write_section_data (FILE* fp, const char *name, char *image,
                                     pe_shdr->raw_data_size, offset, fp,
                                    shname);
 
-          offset += pe_shdr->raw_data_size;
+          offset += secsize;
         }
 
       if (pe_shdr->relocations_offset)
@@ -434,9 +442,13 @@ convert_pe (FILE* fp, const char *name, char *image)
   struct grub_pe32_section_table *pe_shdr;
   int *section_map;
 
-  pe_chdr = (struct grub_pe32_coff_header *) image;
+  if (image[0] == 'M' && image[1] == 'Z')
+    pe_chdr = (struct grub_pe32_coff_header *) (image + (grub_le_to_cpu32 (((grub_uint32_t *)image)[0xf]) + 4));
+  else
+    pe_chdr = (struct grub_pe32_coff_header *) image;
   if (grub_le_to_cpu16 (pe_chdr->machine) != GRUB_PE32_MACHINE_I386)
-    grub_util_error ("invalid coff image");
+    grub_util_error ("invalid coff image (%x != %x)",
+                    grub_le_to_cpu16 (pe_chdr->machine), GRUB_PE32_MACHINE_I386);
 
   strtab = xmalloc (STRTAB_BLOCK);
   strtab_max = STRTAB_BLOCK;
@@ -444,7 +456,13 @@ convert_pe (FILE* fp, const char *name, char *image)
   strtab_len = 1;
 
   offset = sizeof (ehdr);
-  pe_shdr = (struct grub_pe32_section_table *) (pe_chdr + 1);
+  if (pe_chdr->optional_header_size)
+    {
+      struct grub_pe32_optional_header *o;
+      o = (struct grub_pe32_optional_header *) (pe_chdr + 1);
+      image_base = o->image_base;
+    }
+  pe_shdr = (struct grub_pe32_section_table *) ((char *) (pe_chdr + 1) + pe_chdr->optional_header_size);
   num_sections = REL_SECTION;
 
   section_map = write_section_data (fp, name, image, pe_chdr, pe_shdr);