diff options
author | Stefan Hajnoczi <stefanha@gmail.com> | 2010-07-14 10:13:44 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2010-07-14 12:55:59 +0100 |
commit | 8ee6d216e4aabeeee525430b453733874948eddb (patch) | |
tree | 1959785f48651f130048c3573599898a291aa275 /src/include/compiler.h | |
parent | 3338a0398203ac7a5f0c8396c738032b890d710c (diff) | |
download | ipxe-8ee6d216e4aabeeee525430b453733874948eddb.tar.gz |
[build] Mark weak functions noinline
Weak functions whose visibility is hidden may be inlined due to a bug
in GCC. Explicitly mark weak functions noinline to work around the
problem.
This makes the PXE_MENU config option work again, the PXE boot menu
was never being called because the compiler inlined a weak stub
function.
The GCC bug was identified and fixed by Richard Sandiford
<rdsandiford@googlemail.com> but in the meantime iPXE needs to
implement a workaround.
Reported-by: Steve Jones <steve@squaregoldfish.co.uk>
Reported-by: Shao Miller <shao.miller@yrdsb.edu.on.ca>
Suggested-by: Joshua Oreman <oremanj@rwcr.net>
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/compiler.h')
-rw-r--r-- | src/include/compiler.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/include/compiler.h b/src/include/compiler.h index 66e275c2b..16165b369 100644 --- a/src/include/compiler.h +++ b/src/include/compiler.h @@ -181,8 +181,15 @@ REQUEST_EXPANDED ( CONFIG_SYMBOL ); #ifndef ASSEMBLY -/** Declare a function as weak (use *before* the definition) */ -#define __weak __attribute__ (( weak )) +/** Declare a function as weak (use *before* the definition) + * + * Due to a bug in at least GCC 4.4.4 and earlier, weak symbols may be + * inlined if they have hidden visibility (see above for why hidden + * visibility is used). This results in the non-weak symbol never + * being used, so explicitly mark the function as noinline to prevent + * inlining. + */ +#define __weak __attribute__ (( weak, noinline )) #endif |