Source code for cle.backends.tls.tls_object
import logging
from typing import Optional
from cle.backends.backend import Backend
from cle.backends.relocation import Relocation
from cle.errors import CLEError
log = logging.getLogger(__name__)
[docs]class ThreadManager:
"""
This class tracks what data is thread-local and can generate thread initialization images
Most of the heavy lifting will be handled in a subclass
"""
[docs] def __init__(self, loader, arch, max_modules=256):
self.loader = loader
self.arch = arch
self.max_modules = max_modules
self.modules = []
self.threads = []
[docs] def register_object(self, obj):
if not obj.tls_used:
return False
if len(self.modules) >= self.max_modules:
raise CLEError("Too many loaded modules for TLS to handle... file this as a bug")
obj.tls_module_id = len(self.modules)
self.modules.append(obj)
return True
[docs] @staticmethod
def initialization_image(obj) -> Optional[bytes]:
if obj.tls_data_start < 0:
log.warning("The provided object has a negative tls_data_start. Skip TLS loading.")
return None
if obj.tls_data_size <= 0:
log.warning("The provided object has an invalid tls_data_size. Skip TLS loading.")
return None
return obj.memory.load(obj.tls_data_start, obj.tls_data_size).ljust(obj.tls_block_size, b"\0")
[docs] def new_thread(self, insert=True):
thread = self._thread_cls(self)
if insert:
self.loader._internal_load(thread)
self.threads.append(thread)
return thread
@property
def _thread_cls(self):
raise NotImplementedError("This platform doesn't have an implementation of thread-local storage")
[docs]class InternalTLSRelocation(Relocation):
AUTO_HANDLE_NONE = True
@property
def value(self):
return self.val + self.owner.mapped_base