This is expected behavior. When you use -H, then spike doesn't execute any instructions at all. That means when you connect with gdb, none of pk has executed either, which means your program hasn't been started in the simulation.
If you need system calls (eg. printf) you have 2 options:
1. Let pk run until it has started your program. There must be a place you can set a breakpoint (or maybe a sequence of breakpoints) to make that happen. I don't know enough about pk to have done this.
2. To the beginning of your main() function add:
volatile int wait=1;
while (wait) {}
Then you can let spike run without -H and it'll loop forever. While in the loop you can attach with gdb and it'll show you you're in that loop, and you can "p wait=0" to get out of the loop.
If you don't need system calls, then you can start spike with "-H pk" and without your binary name either, since you'll never let spike run. Once attached with gdb you can execute "load" and gdb will download your program into spike. Then you can set a breakpoint at main and run to it.
Tim