In the documentation of "Relocatable Expression Modifiers" Machine Dependencies -> AVR-Dependent -> AVR Syntax -> AVR-Modifiers http://sourceware.org/binutils/docs-2.21/as/AVR_002dModifiers.html#AVR_002dModifiers there is no documentation for gs() modifier (and maybe others). Moreover, description of, e.g. pm_lo8, is very unprecise; it just states that it is "useful for addressing data or code from Flash/Program memory" but does not specify what it really does.
gs() has been used as modifier in order to refer to "generate stubs". For tartgets with more than 128k of flash, jump stubs are placed in the lower 128k memory page. It's use is similar to the pm( ) identifier. pm() and gs() are to be used for accessing addresses in program memory, e.g. for function pointers by ldi() instructions. references will be issued to the elf relocations BFD_RELOC_AVR_LO8_LDI_PM BFD_RELOC_AVR_HI8_LDI_PM and BFD_RELOC_AVR_LO8_LDI_GS BFD_RELOC_AVR_HI8_LDI_GS respectively. The GS elf relocations will return the linker stub address instead of the true address within program memory in case that linker stubs are needed, i.e. in case that the function code is placed beyond the memory range that maybe accessed by 16 bit pointers. Excerpts from src/bfd/elf32-avr.c /* A low 8 bit absolute relocation of 24 bit program memory address. For LDI command. Will not be changed when linker stubs are needed. */ HOWTO (R_AVR_LO8_LDI_PM, /* type */ /* A low 8 bit absolute relocation of 24 bit program memory address. For LDI command. Will not be changed when linker stubs are needed. */ HOWTO (R_AVR_HI8_LDI_PM, /* type */ /* A low 8 bit absolute relocation of 24 bit program memory address. For LDI command. Will be changed when linker stubs are needed. */ HOWTO (R_AVR_LO8_LDI_GS, /* type */