There are a couple of steps you need to do to profile cygwin itself (newlib and winsup). This is preliminary documentation but ought to be applicable to the Beta 20.1 net release. Don't expect things to go smoothly.
From the Cygwin development tools source distribution, configure, build, and install gprof.
Delete all of your .o's in newlib and winsup. Rebuild them all with profiling options:
make -k -w CFLAGS='-pg -O2 -g' CXXFLAGS='-pg -O2 -g'
Note: the dll builds will fail; this is OK. You're not going to use those dlls. Make sure you have a working cygwin.dll available and do not touch or rename it. You'll need it.
OK, now go into winsup and delete mcount.o, gcrt0.o, gmon.o, and profil.o. Rebuild those without -pg. It is possible that mcount.c must be built without -O (this was a problem once, at least) - so just use -g for that one.
Next, you need to build new libraries for newlib and winsup that contain these objects. Here's a script to do it.
You will also need a standalone malloc package. Here's one from djgpp that we modified to work for this context.
Now that you have libcpg.a, libwinpg.a, and malloc.o, you can build your programs like this:
CFLAGS = -g -pg -O2 D = djmalloc.o libwinpg.a libcpg.a libwinpg.a test.exe : test.c $D gcc -pg -g -o test.exe test.c $D -lgdi32 -luser32 gmon.out : test.exe ./test.exe test.gp : gmon.out gprof -b test.exe > test.gp