--- /dev/null
+#include <unistd.h>
+#include <sys/types.h>
+
+/* Use "volatile" to avoid compiler optimization. */
+
+int f1(int i)
+{
+ static uid_t (* volatile g)(void) = getuid;
+ return g() + i;
+}
+
+int f0(volatile int i)
+{
+ static int (* volatile g)(int) = f1;
+ return g(i) - i;
+}
+
+int main(int argc, char** argv)
+{
+ static int (* volatile g)(int) = f0;
+ g(argc);
+ return 0;
+}
--- /dev/null
+#!/bin/sh
+
+# Ensure that strace -k works.
+
+. "${srcdir=.}/init.sh"
+
+# strace -k is implemented using /proc/$pid/maps
+[ -f /proc/self/maps ] ||
+ framework_skip_ '/proc/self/maps is not available'
+
+check_prog sed
+check_prog tr
+
+./stack-fcall ||
+ fail_ 'stack-fcall failed'
+
+$STRACE -h | grep '^-k' > /dev/null ||
+ skip_ 'strace -k is not available'
+
+args="-e getuid -k ./stack-fcall"
+$STRACE $args > $LOG 2>&1 || {
+ cat $LOG
+ fail_ "$STRACE $args failed"
+}
+
+expected='getuid f1 f0 main '
+result=$(sed -n '1,/(main+0x[a-f0-9]\+) .*/ s/^.*(\([^+]\+\)+0x[a-f0-9]\+) .*/\1/p' $LOG |
+ tr '\n' ' ')
+
+test "$result" = "$expected" || {
+ cat $LOG
+ echo "expected: \"$expected\""
+ echo "result: \"$result\""
+ fail_ "unexpected output from $STRACE $args"
+}
+
+exit 0