summaryrefslogtreecommitdiffstats
path: root/src/include/compiler.h
diff options
context:
space:
mode:
authorMichael Brown2013-07-16 00:08:50 +0200
committerMichael Brown2013-07-16 00:50:54 +0200
commitca319873bf43d5d955cc3d8770b5b2415798907d (patch)
tree8168679666b92de3de4ab5f4453c8383b22bc103 /src/include/compiler.h
parent[legal] Add missing FILE_LICENCE declarations (diff)
downloadipxe-ca319873bf43d5d955cc3d8770b5b2415798907d.tar.gz
ipxe-ca319873bf43d5d955cc3d8770b5b2415798907d.tar.xz
ipxe-ca319873bf43d5d955cc3d8770b5b2415798907d.zip
[build] Fix %.licence build target
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>
Diffstat (limited to 'src/include/compiler.h')
-rw-r--r--src/include/compiler.h23
1 files changed, 13 insertions, 10 deletions
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