[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [MINIOS PATCH 4/4] x86: use unified linker script



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 <wei.liu2@xxxxxxxxxx>
---
 .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 0000000..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)
+        }
+        .stab.index 0 : {
+                *(.stab.index)
+        }
+        .stab.indexstr 0 : {
+                *(.stab.indexstr)
+        }
+        .comment 0 : {
+                *(.comment)
+        }
+}
+
+/*
+ * Local variables:
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/x86/minios-x86_32.lds b/arch/x86/minios-x86_32.lds
deleted file mode 100644
index e4e18cb..0000000
--- a/arch/x86/minios-x86_32.lds
+++ /dev/null
@@ -1,78 +0,0 @@
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-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 */
-  . = ALIGN(32 / 8);
-  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
-        LONG(0)
-        __CTOR_END__ = .;
-        }
-
-  .dtors : {
-        __DTOR_LIST__ = .;
-        *(.dtors)
-        LONG(0)
-        __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) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-}
diff --git a/arch/x86/minios-x86_64.lds b/arch/x86/minios-x86_64.lds
deleted file mode 100644
index f6462f3..0000000
--- a/arch/x86/minios-x86_64.lds
+++ /dev/null
@@ -1,78 +0,0 @@
-OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
-OUTPUT_ARCH(i386:x86-64)
-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 */
-  . = ALIGN(64 / 8);
-  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
-        QUAD(0)
-        __CTOR_END__ = .;
-        }
-
-  .dtors : {
-        __DTOR_LIST__ = .;
-        *(.dtors)
-        QUAD(0)
-        __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) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-}
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.