Make i386-* other than i386-pc compileable under cygwin.
This commit is contained in:
parent
6dc3337774
commit
60b967be7e
7 changed files with 51 additions and 24 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5,6 +5,8 @@ SECTIONS
|
|||
.text :
|
||||
{
|
||||
start = . ;
|
||||
_start = . ;
|
||||
__start = . ;
|
||||
*(.text)
|
||||
etext = . ;
|
||||
}
|
||||
|
@ -33,6 +35,8 @@ SECTIONS
|
|||
{
|
||||
*(.edata)
|
||||
end = . ;
|
||||
_end = . ;
|
||||
__end = . ;
|
||||
}
|
||||
.stab :
|
||||
{
|
10
configure.ac
10
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])
|
||||
|
||||
|
|
|
@ -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"""))
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue