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

[Minios-devel] [UNIKRAFT PATCH v3 3/8] build: Introduce default linker script variable



Each platform may define `UK_PLAT_PLATNAME_DEF_LDS`. This variable will
be used by Unikraft build system to different default linker script
from additional linker script and automatically generate rules to link
the final application image. If the platform does not introduce this
variable, then all the linker script would be defined as extra linker
scripts.

Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
---
 doc/guides/developers-platform.rst | 16 +++++++++++-----
 plat/kvm/Makefile.uk               | 13 ++++++++++++-
 plat/xen/Makefile.uk               | 12 ++++++++++++
 support/build/Makefile.rules       |  5 +++--
 4 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/doc/guides/developers-platform.rst 
b/doc/guides/developers-platform.rst
index c39fbb29..be72b1a9 100644
--- a/doc/guides/developers-platform.rst
+++ b/doc/guides/developers-platform.rst
@@ -15,23 +15,29 @@ treated as libraries in Unikraft but there are a few 
differences:
 
 3. You need to provide a linker script and name the file ``Linker.uk``.
 
-4. You need to place all platform files in the Unikraft repo under
+4. The default linker script for a platform is provided using the
+   ``UK_PLAT_PLATNAME_DEF_LDS`` variable in the Makefile.uk of the platform
+   library. The default linker script is also added as a source file to the
+   platform library to be built. If the default linker script is not provided,
+   then Unikraft would rely on the linker script provided by the tool chain.
+
+5. You need to place all platform files in the Unikraft repo under
    ``plat/platname/``.
 
-5. A platform have to implement interfaces defined in ``include/uk/plat``
+6. A platform have to implement interfaces defined in ``include/uk/plat``
    (this is analogue to architectures that have to implement interfaces in
    ``include/uk/arch``)
 
-6. They do not use any external source files, i.e., all source code is
+7. They do not use any external source files, i.e., all source code is
    within the Unikraft tree.
 
-7. They must not have dependencies on external libraries, i.e., the
+8. They must not have dependencies on external libraries, i.e., the
    Unikraft repo must be able to be built on its own. Remember that
    for such builds, ``libnolibc`` has to be sufficient ``libc`` replacement
    to compile, link, and execute internal libraries. This means that nolibc
    has to be extended from time to time.
 
-8. All changes/additions to ``include/uk/plat`` and ``include/uk/arch``
+9. All changes/additions to ``include/uk/plat`` and ``include/uk/arch``
    have to be completely independent of any library (internal and external).
    They do not include any header provided by any library and never conflict
    with any library. Most of the times this is challenging for defining data
diff --git a/plat/kvm/Makefile.uk b/plat/kvm/Makefile.uk
index 7d0c6965..f52bd4ec 100644
--- a/plat/kvm/Makefile.uk
+++ b/plat/kvm/Makefile.uk
@@ -24,6 +24,17 @@ LIBKVMPLAT_ASFLAGS             += -DKVMPLAT
 LIBKVMPLAT_CFLAGS              += -DKVMPLAT
 LIBKVMPLAT_CXXFLAGS            += -DKVMPLAT
 
+##
+## Default Linker script
+ifeq ($(CONFIG_ARCH_X86_64),y)
+UK_PLAT_KVM_DEF_LDS            := $(CONFIG_UK_BASE)/plat/kvm/x86/link64.lds.S
+else
+ifeq ($(CONFIG_ARCH_ARM_64),y)
+UK_PLAT_KVM_DEF_LDS            := $(CONFIG_UK_BASE)/plat/kvm/arm/link64.lds.S
+endif
+endif
+
+
 ##
 ## Architecture library definitions for x86_64
 ##
@@ -81,7 +92,7 @@ LIBKVMPLAT_SRCS-y              += $(LIBKVMPLAT_BASE)/irq.c
 LIBKVMPLAT_SRCS-y              += $(LIBKVMPLAT_BASE)/io.c
 LIBKVMPLAT_SRCS-y              += $(UK_PLAT_COMMON_BASE)/lcpu.c|common
 LIBKVMPLAT_SRCS-y              += $(UK_PLAT_COMMON_BASE)/memory.c|common
-LIBKVMPLAT_SRCS-y              += $(KVM_LDSCRIPT_SRC-y)
+LIBKVMPLAT_SRCS-y              += $(UK_PLAT_KVM_DEF_LDS)
 
 ##
 ## PCI library definitions
diff --git a/plat/xen/Makefile.uk b/plat/xen/Makefile.uk
index 69b10efc..3f185256 100644
--- a/plat/xen/Makefile.uk
+++ b/plat/xen/Makefile.uk
@@ -18,6 +18,16 @@ LIBXENPLAT_ASFLAGS-y     += -DXENPLAT 
-D__XEN_INTERFACE_VERSION__=$(XEN_INTERFAC
 LIBXENPLAT_CFLAGS-y      += -DXENPLAT 
-D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
 LIBXENPLAT_CXXFLAGS-y    += -DXENPLAT 
-D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
 
+##
+## Default Linker script
+ifeq ($(CONFIG_ARCH_X86_64),y)
+UK_PLAT_XEN_DEF_LDS            := $(CONFIG_UK_BASE)/plat/xen/x86/link64.lds.S
+else
+ifeq ($(CONFIG_ARCH_ARM_32),y)
+UK_PLAT_XEN_DEF_LDS            := $(CONFIG_UK_BASE)/plat/xen/arm/link32.lds.S
+endif
+endif
+
 ##
 ## Platform library definitions
 ##
@@ -25,6 +35,8 @@ LIBXENPLAT_ASINCLUDES-y        += -I$(LIBXENPLAT_BASE)/include
 LIBXENPLAT_ASINCLUDES-y        += -I$(UK_PLAT_COMMON_BASE)/include
 LIBXENPLAT_CINCLUDES-y         += -I$(LIBXENPLAT_BASE)/include
 LIBXENPLAT_CINCLUDES-y         += -I$(UK_PLAT_COMMON_BASE)/include
+
+LIBXENPLAT_SRCS-y              += $(UK_PLAT_XEN_DEF_LDS)
 LIBXENPLAT_SRCS-y              += $(LIBXENPLAT_BASE)/hypervisor.c
 LIBXENPLAT_SRCS-y              += $(LIBXENPLAT_BASE)/memory.c
 LIBXENPLAT_SRCS-y              += $(LIBXENPLAT_BASE)/io.c
diff --git a/support/build/Makefile.rules b/support/build/Makefile.rules
index 29e0ce93..3147f4cc 100644
--- a/support/build/Makefile.rules
+++ b/support/build/Makefile.rules
@@ -137,8 +137,9 @@ endef
 # Register a platform to the build system
 define addplat =
 UK_PLATS += $(1)
-$(eval UK_PLAT_$(call uc,$(1))_BASE   := $(_IMPORT_BASE))
-$(eval UK_PLAT_$(call uc,$(1))_LINKER := $(_IMPORT_BASE)/Linker.uk)
+$(eval UK_PLAT_$(call uc,$(1))_BASE    := $(_IMPORT_BASE))
+$(eval UK_PLAT_$(call uc,$(1))_LINKER  := $(_IMPORT_BASE)/Linker.uk)
+$(eval UK_PLAT_$(call uc,$(1))_DEF_LDS :=)
 endef
 
 # addplat_s $platname,$switch
-- 
2.20.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

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