It appears that I need two main() functions
Well, unless you are trying to do something really weird, generally the bootloader and application will be two entirely separate programs, each compiled to its own bin/hex file.  The application would be compiled with .text=0, and the bootloader would be compiled with .text set to the beginning of the boot section.  Note that this information must be passed to the linker, not the compiler.  You can combine the hex files later for ease of flashing, but this is not required.  If you need communication between the two, then you will have to implement a jump table or similar.  You really don't have much space on an atmega8, though.