diff options
-rwxr-xr-x | extra/scripts/initfini.pl | 8 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/initfini.c | 10 |
2 files changed, 18 insertions, 0 deletions
diff --git a/extra/scripts/initfini.pl b/extra/scripts/initfini.pl index 9a5c3ba09..ec6bdb36b 100755 --- a/extra/scripts/initfini.pl +++ b/extra/scripts/initfini.pl @@ -81,6 +81,14 @@ while(<INITFINI>) { $omitcrti = 0; next; } + if (/PROLOG_PAUSES/) { + $omitcrti = 1; + next; + } + if (/PROLOG_UNPAUSES/) { + $omitcrti = 0; + next; + } if (/PROLOG_ENDS/) { $omitcrti = 1; next; diff --git a/libc/sysdeps/linux/common/initfini.c b/libc/sysdeps/linux/common/initfini.c index 9a23c55d0..4f95fbfd1 100644 --- a/libc/sysdeps/linux/common/initfini.c +++ b/libc/sysdeps/linux/common/initfini.c @@ -84,6 +84,16 @@ _init (void) module which has a constructor; but then user code's constructors would come first, and not be profiled. */ call_gmon_start (); +#else + asm ("\n/*@_init_PROLOG_PAUSES*/"); + { + /* Let GCC know that _init is not a leaf function by having a dummy + * function call here. We arrange for this call to be omitted from + * either crt file. */ + extern void i_am_not_a_leaf (void); + i_am_not_a_leaf (); + } + asm ("\n/*@_init_PROLOG_UNPAUSES*/"); #endif asm ("ALIGN"); |