Actually the code in alt_main() does sometimes copy sections from their physical address to the correct virtual address (at least it used to!).
The default linker script puts all the sections into contiguous memory in a single program section, and relies on code being generated to copy the sections to their correct virtual address (ie they are linked with physaddr != virtaddr). This might be what you want if you are loading from flash.
If you are loading from JTAG (for testing) then the JTAG loader will load all the program sections in your elf image to their own physical addresses. So you want a linker script which does just that.
I don't actually use the IDE or any of the altera supplied development tools. I build code with gcc (compiled from the sources altera have to make available to comply with the GPL), link with my own custom linker script that puts expected sections into their correct memeory areas (and errors any unexpected sections).
We then download through the PCIe slave interface and release the nios from soft reset. The code at the reset vector loads %sp and %gp and jumps to the C function that does all the work. I can't quite get rid of %sp and make it available as a general register!