It looks like I misused gdb. I also tested the code on ARM-v6 machine:
$ qemu-system-arm -M versatilepb -cpu arm1176 -kernel math.elf -nographic -serial /dev/null -s -S
QEMU 1.7.50 monitor - type 'help' for more information
(qemu) audio: Could not init `oss' audio driver
and following gdb session returns correct result:
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x00008104 in _start ()
(gdb) n
Single stepping until exit from function _start,
which has no line number information.
0x00009dec in memset ()
(gdb) set $pc = 0x822c
(gdb) n
8 float a = 1.25;
(gdb) n
10 float b = sinf(a);
(gdb) n
11 return 0;
(gdb) p/f $r0
$1 = 0.948984623
(gdb)
Difference in this case is that initialization function is executed first, and then it is jumped to main function. In other words, scott is on the right path, some register initialization is needed. I'm just not sure that it is VFP instruction issue, because I got correct result on ARM-v6 machine. Of course, it works now on ARM-v7 as well.
It looks like I need to learn a little bit more about ARM assembly to find out necessary register initialization parameters.