diff --git a/ChangeLog b/ChangeLog index d28ca02d2..9178e039f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-12-14 Vladimir Serbinenko + + Make i386-* other than i386-pc compileable under cygwin. + 2013-12-14 Vladimir Serbinenko Fix definition of grub_efi_hard_drive_device_path. Take care that diff --git a/conf/Makefile.common b/conf/Makefile.common index d6da66cf5..de55c9ad4 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -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 diff --git a/conf/i386-pc-cygwin-img-ld.sc b/conf/i386-cygwin-img-ld.sc similarity index 91% rename from conf/i386-pc-cygwin-img-ld.sc rename to conf/i386-cygwin-img-ld.sc index 90866c379..3ac26fcce 100644 --- a/conf/i386-pc-cygwin-img-ld.sc +++ b/conf/i386-cygwin-img-ld.sc @@ -5,6 +5,8 @@ SECTIONS .text : { start = . ; + _start = . ; + __start = . ; *(.text) etext = . ; } @@ -33,6 +35,8 @@ SECTIONS { *(.edata) end = . ; + _end = . ; + __end = . ; } .stab : { diff --git a/configure.ac b/configure.ac index 0abbb9927..a4058a266 100644 --- a/configure.ac +++ b/configure.ac @@ -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]) diff --git a/gentpl.py b/gentpl.py index 02bf33523..bdcae1a1c 100644 --- 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""")) diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index 060de4449..a550032a3 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -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'; diff --git a/util/grub-pe2elf.c b/util/grub-pe2elf.c index 44189c12a..131410f15 100644 --- a/util/grub-pe2elf.c +++ b/util/grub-pe2elf.c @@ -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);