The GNU tools for AVR come with the convenience that they work from scratch, no need to concoct your own startup code, linker scripts. Just
$ avr-gcc main.c -Os -mmcu=attiny2313 -Wall -o main.elf
and then flash that ELF file using, say, avrdude.
How the Tools are working together
Add -v to the command line options. avr-gcc will print which commands it is executing, like calling compiler proper (cc1 or cc1plus), assembler (as) or linker (ld).
Add -fverbose-asm -save-temps to see which assembly the compiler is generating (in .s files) and what the pre-processor is generating (in .i for C and .ii for C++).
Use objdump to get dis-assembly; you already found that.
Add -Wl,-Map,main.map to get a map file. This is a text file that shows locations, which symbol is dragged from which library, etc.
Startup Code
This is a mix of AVR-LibC's gcrt1.S (vector table, setting up SFRs like SP, calling main and exit) and libgcc's lib1funcs.S (setting up .data and .bss, calling static constructors and destructors).
If you want to do special stuff, you can provide this as naked asm in one of the .initN sections.
If you want own startup code altogether, provide it but link with -nostartfiles. This will still drag the libgcc parts, except you provide your own __do_clear_bss and __do_copy_data or you'll have to link -nodefaultlibs or -nostdlib.
If you just want to provide start-up code for some device never seen before, the easiest way is to write / generate the respective avr/io.h parts and add support for the new device to AVR-LibC, which is a one-liner in gen-avr-lib-tree.sh.
You may also follow the avr-gcc wiki on Supporting "unsupported" Devices.
Special Function Registers
SFRs are defined as macros by #include <avr/io.h>. This header is also fit to work together with the GNU assembler (with some peculiarities wrt. I/O vs. RAM addresses and AVR_SFR_OFFSET).
avr-gcc starts every assembly file with e.g.
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
so you can use these without further ado in inline assembly.
To use SFRs in inline assembly, pass their address with constraint "n", and use print modifier %i if you want the I/O address.
Linker Scripts
Default linker scripts are shipped with the tools in install path avr/lib/ldscripts/ located in --prefix as of configure.
In almost all cases, the defaults are enough. If not, you can augment them by INCLUDE AFTER <section> etc., see GNU ld documentation.
Notice that the default linker scipts are compiled-in in the ld execuatble, and changing them on file has no effect. Provide your linker description to the linker by means of avr-gcc ... -T <my-ld-script>.
Linking
In almost all cases, you want to link using avr-gcc, not by calling avr-ld directly. For rationale, see for example this answer or this one.