]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[build] Fix %.licence build target
authorMichael Brown <mcb30@ipxe.org>
Mon, 15 Jul 2013 22:08:50 +0000 (00:08 +0200)
committerMichael Brown <mcb30@ipxe.org>
Mon, 15 Jul 2013 22:50:54 +0000 (00:50 +0200)
Our use of --gc-sections causes the linker to discard the symbols
defined by FILE_LICENCE(), meaning that the resulting licence
determination is incomplete.

We must use the KEEP() directive in the linker script to force the
linker to not discard the licence symbols.  Using KEEP(*(COMMON))
would be undesirable, since there are some symbols in COMMON which we
may wish to discard.

Fix by placing symbols defined by PROVIDE_SYMBOL() (which is used by
FILE_LICENCE()) into a special ".provided" section, which we then mark
with KEEP().  All such symbols are zero-length, so there is no cost in
terms of the final binary size.

Since the symbols are no longer in COMMON, the linker will reject
symbols with the same name coming from multiple objects.  We therefore
append the object name to the licence symbol, to ensure that it is
unique.

Reported-by: Marin Hannache <git@mareo.fr>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/Makefile.housekeeping
src/arch/i386/scripts/i386-kir.lds
src/arch/i386/scripts/i386.lds
src/arch/i386/scripts/linux.lds
src/arch/x86/scripts/efi.lds
src/arch/x86_64/scripts/linux.lds
src/include/compiler.h

index 80b70f5cd00962aa4dc5f40754bb322263769da5..8603bfd61fd6b330385487fadb0a1f3221afc9d6 100644 (file)
@@ -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,$<)),\
index 338d6ee878608276f6c3749ae8ec91cd8ae488c0..66bf804e6fb7d95aa41b4f820be65657e9adffb5 100644 (file)
@@ -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 ) {
index fb763656ce4522eda0e97cb13ffd195e8e323640..98f95cb23a4415b90a981e157168cd0180e18c34 100644 (file)
@@ -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)
index 64c9b97fd9a4379005829b40c7bcd77106e01ee3..9f2eeaf3c55e26b4145c96afaef748e87ef1892a 100644 (file)
@@ -53,6 +53,8 @@ SECTIONS {
                *(.data)
                *(.data.*)
                KEEP(*(SORT(.tbl.*)))
+               KEEP(*(.provided))
+               KEEP(*(.provided.*))
                _edata = .;
        }
 
index 1a16c29bd05f9bb7abfc71496e2d8b29963339d8..f1049f24b007040688b4bc9a518329cf7b292cb5 100644 (file)
@@ -55,6 +55,8 @@ SECTIONS {
        *(.data)
        *(.data.*)
        KEEP(*(SORT(.tbl.*)))   /* Various tables.  See include/tables.h */
+       KEEP(*(.provided))
+       KEEP(*(.provided.*))
        _edata = .;
     }
 
index 85e548ffe811803195d43f41c9a234c441ceed88..47db21745d927db6ac53c3cadeaea2bd2af76ffe 100644 (file)
@@ -53,6 +53,8 @@ SECTIONS {
                *(.data)
                *(.data.*)
                KEEP(*(SORT(.tbl.*)))
+               KEEP(*(.provided))
+               KEEP(*(.provided.*))
                _edata = .;
        }
 
index e55592456a80265fad6d5cefaa96317d1b5ac587..132793b5d400d2f7e408d51af2017f8760cca798 100644 (file)
 /** 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