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

2016-08-17 Thread Andrew Cooper
On 17/08/16 13:35, Wei Liu wrote:
> 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)

While merging, it would be worth switching to the single-parameter form
of OUTPUT_FORMAT().  x86 does not exist in big-endian[1].

~Andrew

[1] despite what the OpenSSL authors might believe -
http://opensslrampage.org/post/83031733755/remove-support-for-big-endian-i386-and
or https://lwn.net/Articles/595697/

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


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

2016-08-17 Thread Wei Liu
On Wed, Aug 17, 2016 at 01:35:14PM +0100, Wei Liu wrote:
> 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 
[...]
> +/* newlib initialization functions */
> +#if defined(__x86_64__)
> +. = ALIGN(64 / 8);
> +#else /* __i386 __ */
> +. = ALIGN(64 / 8);

Oops, this should be 32 / 8.

Wei.

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


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

2016-08-17 Thread Wei Liu
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)
+