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; };