Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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>
  • Loading branch information
stefanha authored and mcb30 committed Jul 14, 2010
1 parent 3338a03 commit 8ee6d21
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/include/compiler.h
Expand Up @@ -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

Expand Down

0 comments on commit 8ee6d21

Please sign in to comment.