diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping index 80b70f5c..8603bfd6 100644 --- a/src/Makefile.housekeeping +++ b/src/Makefile.housekeeping @@ -1011,15 +1011,20 @@ $(BIN)/%.nodeps : $(BIN)/%.tmp # Get licensing verdict for the specified target # define licensable_deps_list - $(filter-out config/local/%.h,$(call deps_list,$(1))) + $(filter-out config/local/%.h,\ + $(filter-out $(BIN)/.%.list,\ + $(call deps_list,$(1)))) endef define unlicensed_deps_list $(shell grep -L FILE_LICENCE $(call licensable_deps_list,$(1))) endef define licence_list - $(patsubst __licence_%,%,\ - $(filter __licence_%,$(shell $(NM) $(1) | cut -d" " -f3))) + $(sort $(foreach LICENCE,\ + $(filter __licence__%,$(shell $(NM) $(1) | cut -d" " -f3)),\ + $(word 2,$(subst __, ,$(LICENCE))))) endef +$(BIN)/%.licence_list : $(BIN)/%.tmp + $(Q)$(ECHO) $(call licence_list,$<) $(BIN)/%.licence : $(BIN)/%.tmp $(QM)$(ECHO) " [LICENCE] $@" $(Q)$(if $(strip $(call unlicensed_deps_list,$<)),\ diff --git a/src/arch/i386/scripts/i386-kir.lds b/src/arch/i386/scripts/i386-kir.lds index 338d6ee8..66bf804e 100644 --- a/src/arch/i386/scripts/i386-kir.lds +++ b/src/arch/i386/scripts/i386-kir.lds @@ -98,6 +98,8 @@ SECTIONS { *(.data) *(.data.*) KEEP(*(SORT(.tbl.*))) /* Various tables. See include/tables.h */ + KEEP(*(.provided)) + KEEP(*(.provided.*)) _edata16_progbits = .; } .bss16 : AT ( _data16_load_offset + __bss16 ) { diff --git a/src/arch/i386/scripts/i386.lds b/src/arch/i386/scripts/i386.lds index fb763656..98f95cb2 100644 --- a/src/arch/i386/scripts/i386.lds +++ b/src/arch/i386/scripts/i386.lds @@ -109,6 +109,8 @@ SECTIONS { *(.data) *(.data.*) KEEP(*(SORT(.tbl.*))) /* Various tables. See include/tables.h */ + KEEP(*(.provided)) + KEEP(*(.provided.*)) _mtextdata = .; } .bss.textdata (NOLOAD) : AT ( _end_lma ) { *(.bss) diff --git a/src/arch/i386/scripts/linux.lds b/src/arch/i386/scripts/linux.lds index 64c9b97f..9f2eeaf3 100644 --- a/src/arch/i386/scripts/linux.lds +++ b/src/arch/i386/scripts/linux.lds @@ -53,6 +53,8 @@ SECTIONS { *(.data) *(.data.*) KEEP(*(SORT(.tbl.*))) + KEEP(*(.provided)) + KEEP(*(.provided.*)) _edata = .; } diff --git a/src/arch/x86/scripts/efi.lds b/src/arch/x86/scripts/efi.lds index 1a16c29b..f1049f24 100644 --- a/src/arch/x86/scripts/efi.lds +++ b/src/arch/x86/scripts/efi.lds @@ -55,6 +55,8 @@ SECTIONS { *(.data) *(.data.*) KEEP(*(SORT(.tbl.*))) /* Various tables. See include/tables.h */ + KEEP(*(.provided)) + KEEP(*(.provided.*)) _edata = .; } diff --git a/src/arch/x86_64/scripts/linux.lds b/src/arch/x86_64/scripts/linux.lds index 85e548ff..47db2174 100644 --- a/src/arch/x86_64/scripts/linux.lds +++ b/src/arch/x86_64/scripts/linux.lds @@ -53,6 +53,8 @@ SECTIONS { *(.data) *(.data.*) KEEP(*(SORT(.tbl.*))) + KEEP(*(.provided)) + KEEP(*(.provided.*)) _edata = .; } diff --git a/src/include/compiler.h b/src/include/compiler.h index e5559245..132793b5 100644 --- a/src/include/compiler.h +++ b/src/include/compiler.h @@ -60,12 +60,15 @@ /** Provide a symbol within this object file */ #ifdef ASSEMBLY #define PROVIDE_SYMBOL( _sym ) \ + .section ".provided", "a", @nobits ; \ + .hidden _sym ; \ .globl _sym ; \ - .comm _sym, 0 + _sym: ; \ + .previous #else /* ASSEMBLY */ #define PROVIDE_SYMBOL( _sym ) \ - extern char _sym[]; \ - char _sym[0] + char _sym[0] \ + __attribute__ (( section ( ".provided" ) )) #endif /* ASSEMBLY */ /** Require a symbol within this object file @@ -652,7 +655,7 @@ int __debug_disable; * be in the public domain. */ #define FILE_LICENCE_PUBLIC_DOMAIN \ - PROVIDE_SYMBOL ( __licence_public_domain ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__public_domain__ ) ) /** Declare a file as being under version 2 (or later) of the GNU GPL * @@ -661,7 +664,7 @@ int __debug_disable; * (at your option) any later version". */ #define FILE_LICENCE_GPL2_OR_LATER \ - PROVIDE_SYMBOL ( __licence_gpl2_or_later ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl2_or_later__ ) ) /** Declare a file as being under version 2 of the GNU GPL * @@ -670,7 +673,7 @@ int __debug_disable; * "or, at your option, any later version" clause. */ #define FILE_LICENCE_GPL2_ONLY \ - PROVIDE_SYMBOL ( __licence_gpl2_only ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl2_only__ ) ) /** Declare a file as being under any version of the GNU GPL * @@ -682,7 +685,7 @@ int __debug_disable; * version ever published by the Free Software Foundation". */ #define FILE_LICENCE_GPL_ANY \ - PROVIDE_SYMBOL ( __licence_gpl_any ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl_any__ ) ) /** Declare a file as being under the three-clause BSD licence * @@ -707,7 +710,7 @@ int __debug_disable; * functionally equivalent to the standard three-clause BSD licence. */ #define FILE_LICENCE_BSD3 \ - PROVIDE_SYMBOL ( __licence_bsd3 ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__bsd3__ ) ) /** Declare a file as being under the two-clause BSD licence * @@ -728,7 +731,7 @@ int __debug_disable; * functionally equivalent to the standard two-clause BSD licence. */ #define FILE_LICENCE_BSD2 \ - PROVIDE_SYMBOL ( __licence_bsd2 ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__bsd2__ ) ) /** Declare a file as being under the one-clause MIT-style licence * @@ -738,7 +741,7 @@ int __debug_disable; * permission notice appear in all copies. */ #define FILE_LICENCE_MIT \ - PROVIDE_SYMBOL ( __licence_mit ) + PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__mit__ ) ) /** Declare a particular licence as applying to a file */ #define FILE_LICENCE( _licence ) FILE_LICENCE_ ## _licence