I can't speak for Linux, but in general TLS storage is used to allow each thread to allocated arbitrary storage that is specific to the thread.
I assume you are really just emulating x86 instructions (after you've elf-loaded), so elf isn't interesting here.
In that case, you need to simulate TLS storage. That is, for each (you have to keep track of this) emulated thread, you need to keep track of a separate values associated with that thread's GS register. To do this, you'll need to emulate the OS thread-create/stop/inspect/kill calls, and the OS-TLS initialization calls. The (emulated) thread-create calls will cause specific allocated space inside the emulated VM to be assigned to that emulated thread's GS register.
Once you have that, emulating the GS accesses should be enough, since everything else about TLS is just regular machine instructions that operate inside the process space.