diff --git a/elf.cc b/elf.cc
index f4339acf72807c92e387274834f1df3c50747fec..60dc233f86e8fe4d90cd8967aeb714c221fa7384 100644
--- a/elf.cc
+++ b/elf.cc
@@ -15,6 +15,9 @@ namespace elf {
 
     elf_object::elf_object(program& prog)
         : _prog(prog)
+        , _tls_segment()
+        , _tls_init_size()
+        , _tls_uninit_size()
         , _dynamic_table(nullptr)
     {
     }
@@ -139,6 +142,11 @@ namespace elf {
             case PT_NOTE:
             case PT_GNU_STACK:
                 break;
+            case PT_TLS:
+                _tls_segment = _base + phdr.p_vaddr;
+                _tls_init_size = phdr.p_filesz;
+                _tls_uninit_size = phdr.p_memsz - phdr.p_filesz;
+                break;
             case PT_GNU_EH_FRAME:
                 load_segment(phdr);
                 break;
diff --git a/elf.hh b/elf.hh
index f400b651e30100bb833a1e3db57dc4776ec66af0..1ed9e051239a6ca88779a868c3950d363178d23a 100644
--- a/elf.hh
+++ b/elf.hh
@@ -79,6 +79,7 @@ namespace elf {
         PT_DYNAMIC = 2, // Dynamic linking tables
         PT_INTERP = 3, // Program interpreter path name
         PT_NOTE = 4, // Note sections
+        PT_TLS = 7, // Thread local storage initial segment
         PT_GNU_EH_FRAME = 0x6474e550, // Exception handling records
         PT_GNU_STACK = 0x6474e551, // Stack permissions record
     };
@@ -227,6 +228,8 @@ namespace elf {
 	std::vector<Elf64_Phdr> _phdrs;
 	void* _base;
 	void* _end;
+	void* _tls_segment;
+	ulong _tls_init_size, _tls_uninit_size;
 	Elf64_Dyn* _dynamic_table;
     };