diff --git a/src/arch/i386/Makefile.linux b/src/arch/i386/Makefile.linux new file mode 100644 index 000000000..46328c83b --- /dev/null +++ b/src/arch/i386/Makefile.linux @@ -0,0 +1,6 @@ +LDSCRIPT = arch/i386/scripts/linux.lds + +SRCDIRS += arch/i386/core/linux + +MAKEDEPS += arch/x86/Makefile.linux +include arch/x86/Makefile.linux diff --git a/src/arch/i386/scripts/linux.lds b/src/arch/i386/scripts/linux.lds new file mode 100644 index 000000000..94b7b900e --- /dev/null +++ b/src/arch/i386/scripts/linux.lds @@ -0,0 +1,101 @@ +/* -*- sh -*- */ + +/* + * Linker script for i386 Linux images + * + */ + +OUTPUT_FORMAT ( "elf32-i386", "elf32-i386", "elf32-i386" ) +OUTPUT_ARCH ( i386 ) + +ENTRY ( _start ) + +SECTIONS { + _max_align = 32; + + . = 0x08048000; + + /* + * The text section + * + */ + + . = ALIGN ( _max_align ); + .text : { + _text = .; + *(.text) + *(.text.*) + _etext = .; + } + + /* + * The rodata section + * + */ + + . = ALIGN ( _max_align ); + .rodata : { + _rodata = .; + *(.rodata) + *(.rodata.*) + _erodata = .; + } + + /* + * The data section + * + */ + + . = ALIGN ( _max_align ); + .data : { + _data = .; + *(.data) + *(.data.*) + *(SORT(.tbl.*)) /* Various tables. See include/tables.h */ + _edata = .; + } + + /* + * The bss section + * + */ + + . = ALIGN ( _max_align ); + .bss : { + _bss = .; + *(.bss) + *(.bss.*) + *(COMMON) + _ebss = .; + } + + /* + * Weak symbols that need zero values if not otherwise defined + * + */ + + .weak 0x0 : { + _weak = .; + *(.weak) + _eweak = .; + } + _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" ); + + /* + * Dispose of the comment and note sections to make the link map + * easier to read + * + */ + + /DISCARD/ : { + *(.comment) + *(.comment.*) + *(.note) + *(.note.*) + *(.eh_frame) + *(.eh_frame.*) + *(.rel) + *(.rel.*) + *(.discard) + } +} diff --git a/src/arch/x86/Makefile b/src/arch/x86/Makefile index f5f67ac78..e5b651732 100644 --- a/src/arch/x86/Makefile +++ b/src/arch/x86/Makefile @@ -5,5 +5,8 @@ INCDIRS += arch/x86/include # x86-specific directories containing source files # SRCDIRS += arch/x86/core -SRCDIRS += arch/x86/interface/efi -SRCDIRS += arch/x86/prefix +SRCDIRS += arch/x86/interface/efi +SRCDIRS += arch/x86/prefix + +# breaks building some of the linux-related objects +CFLAGS += -Ulinux diff --git a/src/arch/x86/Makefile.linux b/src/arch/x86/Makefile.linux new file mode 100644 index 000000000..c3471dd75 --- /dev/null +++ b/src/arch/x86/Makefile.linux @@ -0,0 +1,8 @@ +MEDIA = linux + +INCDIRS += arch/x86/include/linux +SRCDIRS += arch/x86/core/linux + +$(BIN)/%.linux : $(BIN)/%.linux.tmp + $(QM)$(ECHO) " [FINISH] $@" + $(Q)cp -p $< $@ diff --git a/src/arch/x86_64/Makefile.linux b/src/arch/x86_64/Makefile.linux new file mode 100644 index 000000000..154f9d40d --- /dev/null +++ b/src/arch/x86_64/Makefile.linux @@ -0,0 +1,6 @@ +LDSCRIPT = arch/x86_64/scripts/linux.lds + +SRCDIRS += arch/x86_64/core/linux + +MAKEDEPS += arch/x86/Makefile.linux +include arch/x86/Makefile.linux diff --git a/src/arch/x86_64/scripts/linux.lds b/src/arch/x86_64/scripts/linux.lds new file mode 100644 index 000000000..34eb3561b --- /dev/null +++ b/src/arch/x86_64/scripts/linux.lds @@ -0,0 +1,101 @@ +/* -*- sh -*- */ + +/* + * Linker script for x86_64 Linux images + * + */ + +OUTPUT_FORMAT ( "elf64-x86-64", "elf64-x86-64", "elf64-x86-64" ) +OUTPUT_ARCH ( i386:x86-64 ) + +ENTRY ( _start ) + +SECTIONS { + _max_align = 32; + + . = 0x400000; + + /* + * The text section + * + */ + + . = ALIGN ( _max_align ); + .text : { + _text = .; + *(.text) + *(.text.*) + _etext = .; + } + + /* + * The rodata section + * + */ + + . = ALIGN ( _max_align ); + .rodata : { + _rodata = .; + *(.rodata) + *(.rodata.*) + _erodata = .; + } + + /* + * The data section + * + */ + + . = ALIGN ( _max_align ); + .data : { + _data = .; + *(.data) + *(.data.*) + *(SORT(.tbl.*)) /* Various tables. See include/tables.h */ + _edata = .; + } + + /* + * The bss section + * + */ + + . = ALIGN ( _max_align ); + .bss : { + _bss = .; + *(.bss) + *(.bss.*) + *(COMMON) + _ebss = .; + } + + /* + * Weak symbols that need zero values if not otherwise defined + * + */ + + .weak 0x0 : { + _weak = .; + *(.weak) + _eweak = .; + } + _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" ); + + /* + * Dispose of the comment and note sections to make the link map + * easier to read + * + */ + + /DISCARD/ : { + *(.comment) + *(.comment.*) + *(.note) + *(.note.*) + *(.eh_frame) + *(.eh_frame.*) + *(.rel) + *(.rel.*) + *(.discard) + } +} diff --git a/src/config/defaults/linux.h b/src/config/defaults/linux.h new file mode 100644 index 000000000..fbb2c17b9 --- /dev/null +++ b/src/config/defaults/linux.h @@ -0,0 +1,12 @@ +#ifndef CONFIG_DEFAULTS_LINUX_H +#define CONFIG_DEFAULTS_LINUX_H + +/** @file + * + * Configuration defaults for linux + * + */ + +#define IMAGE_SCRIPT + +#endif /* CONFIG_DEFAULTS_LINUX_H */