Hello,

According to getcontext(3), the *context functions and the ucontext_t
structure are defined in <ucontext.h>.

If you take this simple program:

"""
#define _GNU_SOURCE
#include <ucontext.h>

int main(void)
{
        ucontext_t *ucontext;
        return ucontext->uc_mcontext.uc_regs->gregs[0];
}
"""

and build it with a uClibc-ng PowerPC toolchain, it will fail with:

"""
foo.c: In function 'main':
foo.c:5:2: error: unknown type name 'ucontext_t'
  ucontext_t *ucontext;
...
"""

And indeed <ucontext.h> in uClibc-ng only includes <sys/ucontext.h> if
__UCLIBC_HAS_CONTEXT_FUNCS__ is defined, which is not the case on
PowerPC. And since <sys/ucontext.h> is where ucontext_t is defined, the
build failure is expected.

However, now, change the program to:

"""
#define _GNU_SOURCE
#include <ucontext.h>
#include <signal.h>

int main(void)
{
        ucontext_t *ucontext;
        return ucontext->uc_mcontext.uc_regs->gregs[0];
}
"""

i.e with just <signal.h> included. And now, it builds fine!

Indeed <signal.h> includes <sys/ucontext.h> unconditionally, without
taking care of __UCLIBC_HAS_CONTEXT_FUNCS__. This seems broken to me,
as-is the fact that some ucontext structures are defined in a header
file even if the platform doesn't support context functions.

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
_______________________________________________
devel mailing list
devel@uclibc-ng.org
http://mailman.uclibc-ng.org/cgi-bin/mailman/listinfo/devel

Reply via email to