From: Waldemar Kozaczuk <[email protected]> Committer: Waldemar Kozaczuk <[email protected]> Branch: master
elf: refine logging This patch adds new build configuration option - `conf-debug_elf`, intended to enable logging in dynamic linker logic. It also refines/adds relevant comments. Signed-off-by: Waldemar Kozaczuk <[email protected]> --- diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -317,7 +317,7 @@ $(out)/bsd/%.o: INCLUDES += -isystem bsd/ # for machine/ $(out)/bsd/%.o: INCLUDES += -isystem bsd/$(arch) -configuration-defines = conf-preempt conf-debug_memory conf-logger_debug +configuration-defines = conf-preempt conf-debug_memory conf-logger_debug conf-debug_elf configuration = $(foreach cf,$(configuration-defines), \ -D$(cf:conf-%=CONF_%)=$($(cf))) diff --git a/arch/x64/arch-elf.cc b/arch/x64/arch-elf.cc --- a/arch/x64/arch-elf.cc +++ b/arch/x64/arch-elf.cc @@ -10,6 +10,12 @@ #include <osv/elf.hh> #include <osv/sched.hh> +#if CONF_debug_elf +#define elf_debug(format,...) kprintf("ELF [tid:%d, mod:%d, %s]: " format, sched::thread::current()->id(), _module_index, _pathname.c_str(), ##__VA_ARGS__) +#else +#define elf_debug(...) +#endif + namespace elf { // This function is solely used to relocate symbols in OSv kernel ELF @@ -105,7 +111,7 @@ bool object::arch_relocate_rela(u32 type, u32 sym, void *addr, // which provides dynamic access of thread local variable // This calculates the module index of the ELF containing the variable if (sym == STN_UNDEF) { - // The thread-local variable being accessed is within + // The thread-local variable (most likely static) being accessed is within // the SAME shared object as the caller *static_cast<u64*>(addr) = _module_index; // No need to calculate the offset to the beginning @@ -114,11 +120,13 @@ bool object::arch_relocate_rela(u32 type, u32 sym, void *addr, // in DIFFERENT shared object that the caller *static_cast<u64*>(addr) = symbol(sym).obj->_module_index; } + elf_debug("arch_relocate_rela, R_X86_64_DTPMOD64 for sym:%d, mod ID:%ld\n", sym, (*static_cast<u64*>(addr))); break; case R_X86_64_DTPOFF64: // The thread-local variable being accessed is located // in DIFFERENT shared object that the caller *static_cast<u64*>(addr) = symbol(sym).symbol->st_value; + elf_debug("arch_relocate_rela, R_X86_64_DTPOFF64 for sym:%d, offset:%ld\n", sym, (*static_cast<u64*>(addr))); break; case R_X86_64_TPOFF64: // This type is intended to resolve symbols of thread-local variables in static TLS @@ -143,11 +151,13 @@ bool object::arch_relocate_rela(u32 type, u32 sym, void *addr, } *static_cast<u64*>(addr) = sm.symbol->st_value + addend - tls_offset; } else { - // TODO: Which case does this handle? + // The static (local to this module) thread-local variable/s being accessed within + // same module so we just need to set the offset for corresponding static TLS block alloc_static_tls(); auto tls_offset = static_tls_end() + sched::kernel_tls_size(); *static_cast<u64*>(addr) = addend - tls_offset; } + elf_debug("arch_relocate_rela, R_X86_64_TPOFF64 for sym:%d, TP offset:%ld\n", sym, (*static_cast<u64*>(addr))); break; default: return false; diff --git a/arch/x64/arch-switch.hh b/arch/x64/arch-switch.hh --- a/arch/x64/arch-switch.hh +++ b/arch/x64/arch-switch.hh @@ -170,6 +170,10 @@ void thread::setup_tcb() // (see arch/x64/loader.ld for specifics) with an extra buffer at // the end of the kernel TLS to accommodate TLS block of pies and // position-dependant executables. + // + // Please note that the TLS layout conforms to the variant II (2), + // which means for example that all variable offsets are negative. + // It also means that individual objects are laid out from the right to the left. // (1) - TLS memory area layout with app shared library // |-----|-----|-----|--------------|------| diff --git a/conf/base.mk b/conf/base.mk --- a/conf/base.mk +++ b/conf/base.mk @@ -9,3 +9,5 @@ conf-logger_debug=0 # This macro controls the NDEBUG macro that is used to identify the debug # build variant in the code. conf-DEBUG_BUILD=0 + +conf-debug_elf=0 diff --git a/core/elf.cc b/core/elf.cc --- a/core/elf.cc +++ b/core/elf.cc @@ -31,10 +31,8 @@ #include "arch.hh" -#define ELF_DEBUG_ENABLED 0 - -#if ELF_DEBUG_ENABLED -#define elf_debug(format,...) kprintf("ELF [tid:%d, %s]: " format, sched::thread::current()->id(), _pathname.c_str(), ##__VA_ARGS__) +#if CONF_debug_elf +#define elf_debug(format,...) kprintf("ELF [tid:%d, mod:%d, %s]: " format, sched::thread::current()->id(), _module_index, _pathname.c_str(), ##__VA_ARGS__) #else #define elf_debug(...) #endif @@ -376,7 +374,7 @@ void object::set_base(void* base) } _end = _base + q->p_vaddr + q->p_memsz; - elf_debug("The base set to: 0x%016x and end: 0x%016x\n", _base, _end); + elf_debug("The base set to: %018p and end: %018p\n", _base, _end); } void* object::base() const @@ -417,7 +415,7 @@ void file::load_segment(const Elf64_Phdr& phdr) mmu::map_anon(_base + vstart + filesz, memsz - filesz, flag, perm); } } - elf_debug("Loaded and mapped PT_LOAD segment at: 0x%016x of size: 0x%x\n", _base + vstart, filesz); //TODO: Add memory? + elf_debug("Loaded and mapped PT_LOAD segment at: %018p of size: 0x%x\n", _base + vstart, filesz); } bool object::mlocked() @@ -523,7 +521,7 @@ void object::process_headers() _tls_init_size = phdr.p_filesz; _tls_uninit_size = phdr.p_memsz - phdr.p_filesz; _tls_alignment = phdr.p_align; - elf_debug("Found TLS segment at 0x%016x of aligned size: %x\n", _tls_segment, get_aligned_tls_size()); + elf_debug("Found TLS segment at %018p of aligned size: 0x%x\n", _tls_segment, get_aligned_tls_size()); break; default: abort("Unknown p_type in executable %s: %d\n", pathname(), phdr.p_type); @@ -1211,7 +1209,7 @@ void object::alloc_static_tls() if (!_static_tls && tls_size) { _static_tls = true; _static_tls_offset = _static_tls_alloc.fetch_add(tls_size, std::memory_order_relaxed); - elf_debug("Allocated static TLS at 0x%016x of size: 0x%x\n", _static_tls_offset, tls_size); + elf_debug("Allocated static TLS at offset: 0x%x of size: 0x%x\n", _static_tls_offset, tls_size); } } -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/00000000000056385405b24ec55c%40google.com.
