There are only a few differences between i386 and x86-64 linker scripts.
Unify them into one. Re-indent the file at the same time.
Construct a special rule in top-level directory to cope with the change.
Ideally the build system should also be made more elegant, but
overhauling the build system is out of scope of this patch.
Signed-off-by: Wei Liu
---
.gitignore | 1 +
Makefile | 6 +-
arch/x86/Makefile | 1 +
arch/x86/minios-x86.lds.S | 133 +
arch/x86/minios-x86_32.lds | 78 --
arch/x86/minios-x86_64.lds | 78 --
6 files changed, 140 insertions(+), 157 deletions(-)
create mode 100644 arch/x86/minios-x86.lds.S
delete mode 100644 arch/x86/minios-x86_32.lds
delete mode 100644 arch/x86/minios-x86_64.lds
diff --git a/.gitignore b/.gitignore
index f21cc46..efc193c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
*.o
*.a
*.swp
+arch/x86/minios-x86*.lds
include/list.h
mini-os
mini-os.gz
diff --git a/Makefile b/Makefile
index 5464e89..779bc91 100644
--- a/Makefile
+++ b/Makefile
@@ -148,7 +148,11 @@ ifneq ($(APP_OBJS),)
APP_O=$(OBJ_DIR)/$(TARGET)_app.o
endif
-$(OBJ_DIR)/$(TARGET): $(OBJS) $(APP_O) arch_lib
+# Special rule for x86 for now
+arch/x86/minios-x86%.lds: arch/x86/minios-x86.lds.S
+ $(CPP) $(ASFLAGS) -P $< -o $@
+
+$(OBJ_DIR)/$(TARGET): $(OBJS) $(APP_O) arch_lib
$(TARGET_ARCH_DIR)/minios-$(MINIOS_TARGET_ARCH).lds
$(LD) -r $(LDFLAGS) $(HEAD_OBJ) $(APP_O) $(OBJS) $(LDARCHLIB) $(LDLIBS)
-o $@.o
$(OBJCOPY) -w -G $(GLOBAL_PREFIX)* -G _start $@.o $@.o
$(LD) $(LDFLAGS) $(LDFLAGS_FINAL) $@.o $(EXTRA_OBJS) -o $@
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 0052b4c..dbe9ca6 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -24,4 +24,5 @@ $(OBJ_DIR)/$(ARCH_LIB): $(ARCH_OBJS)
$(OBJ_DIR)/$(HEAD_ARCH_OBJ)
clean:
rm -f $(OBJ_DIR)/$(ARCH_LIB) $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ)
+ rm -f minios-x86_32.lds minios-x86_64.lds
diff --git a/arch/x86/minios-x86.lds.S b/arch/x86/minios-x86.lds.S
new file mode 100644
index 000..65650ab
--- /dev/null
+++ b/arch/x86/minios-x86.lds.S
@@ -0,0 +1,133 @@
+#if defined(__x86_64__)
+
+OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
+OUTPUT_ARCH(i386:x86-64)
+
+#elif defined(__i386__)
+#undef i386
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+
+#else
+# error Bad architecture to link with
+#endif
+
+ENTRY(_start)
+SECTIONS
+{
+. = 0x0;
+_text = .; /* Text and read-only data */
+.text : {
+*(.text)
+*(.gnu.warning)
+} = 0x9090
+
+_etext = .;/* End of text section */
+
+.rodata : {
+*(.rodata)
+*(.rodata.*)
+}
+. = ALIGN(4096);
+_erodata = .;
+
+.note : {
+*(.note)
+*(.note.*)
+}
+
+/* newlib initialization functions */
+#if defined(__x86_64__)
+. = ALIGN(64 / 8);
+#else /* __i386 __ */
+. = ALIGN(64 / 8);
+#endif
+PROVIDE (__preinit_array_start = .);
+.preinit_array : {
+*(.preinit_array)
+}
+PROVIDE (__preinit_array_end = .);
+PROVIDE (__init_array_start = .);
+.init_array : {
+*(.init_array)
+}
+PROVIDE (__init_array_end = .);
+PROVIDE (__fini_array_start = .);
+.fini_array : {
+*(.fini_array)
+}
+PROVIDE (__fini_array_end = .);
+
+.ctors : {
+__CTOR_LIST__ = .;
+*(.ctors)
+CONSTRUCTORS
+#if defined(__x86_64__)
+QUAD(0)
+#else /* __i386__ */
+LONG(0)
+#endif
+__CTOR_END__ = .;
+}
+
+.dtors : {
+__DTOR_LIST__ = .;
+*(.dtors)
+#if defined(__x86_64__)
+QUAD(0)
+#else /* __i386__ */
+LONG(0)
+#endif
+__DTOR_END__ = .;
+}
+
+.data : { /* Data */
+*(.data)
+}
+
+_edata = .;/* End of data section */
+
+__bss_start = .; /* BSS */
+.bss : {
+*(.bss)
+*(.app.bss)
+}
+_end = . ;
+
+/* Sections to be discarded */
+/DISCARD/ : {
+*(.text.exit)
+*(.data.exit)
+*(.exitcall.exit)
+}
+
+/* Stabs debugging sections. */
+.stab 0 : {
+*(.stab)
+}
+.stabstr 0 : {
+*(.stabstr)
+}
+.stab.excl 0 : {
+*(.stab.excl)
+}
+.stab.exclstr 0 : {
+*(.stab.exclstr)
+