I may not be the best one to advise you about gdb. I consider gdb "unfriendly". As a consequence, I don't use it much. As a consequence, I haven't learned to use it. As a consequence, I continue to find it "unfriendly". I suggest you be smarter and learn to use it!
One clue I can give you is that giving the "-s" switch to ld strips the debugging symbols that you've told Nasm to add. Lose that, for starters.
The late Chuck Crayne, as one of his last contributions to Nasm, added the "dwarf" debugging symbols (previously it was just "stabs"). It's supposed to be the "native" format for gdb. To be honest, I haven't noticed any difference (note that I don't use it much!), but I use "-F dwarf" as a tribute to Chuck, when I use it. You don't need to use both "-g" and "-F dwarf" (used to need both - another change Chuck made). Just "-g" will give you the "default" debugging info format, which is "stabs". Just "-F dwarf" is all you need (the "-g" does no harm). That, and omit the toxic "-s" to ld... Hey, the command line's getting shorter!
It also helps to put a "nop" as the first instruction after your "_start" label. Any single-byte instruction may work (cld ?), but "nop" definitely helps. If you're starting with "main" (give gcc the "-g" switch), I don't think you need this, but it shouldn't hurt...
I have a few debuggers that I sometimes use as alternatives to gdb. Some of 'em are even written in Nasm syntax! I'll attach 'em or something if you (anyone) wants to look at 'em, but I think the "right" answer is to learn to use the "monster headache"! There may be a tutorial around:
http://asm.sf.net somewhere(?).
I think your main problem is actually an "ld error" rather than a "Nasm error" or a "gdb error", but it results in thwarting us either way. Lose the "-s" switch to ld, and let us know how it goes from there (if you would).
Best,
Frank