From: Waldemar Kozaczuk <jwkozac...@gmail.com> Committer: WALDEMAR KOZACZUK <jwkozac...@gmail.com> Branch: master
auxv: expose AT_MINSIGSTKSZ and AT_RANDOM This patch adds AT_MINSIGSTKSZ and AT_RANDOM to auxiliary vector. These two values are needed to support static executables. Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com> --- diff --git a/core/app.cc b/core/app.cc --- a/core/app.cc +++ b/core/app.cc @@ -20,6 +20,7 @@ #include <boost/range/algorithm/transform.hpp> #include <osv/wait_record.hh> #include "libc/pthread.hh" +#include <sys/random.h> using namespace boost::range; @@ -333,6 +334,8 @@ void application::main() // _entry_point() doesn't return } +static u64 random_bytes[2]; + void application::prepare_argv(elf::program *program) { // Prepare program_* variable used by the libc @@ -360,13 +363,23 @@ void application::prepare_argv(elf::program *program) } // Load vdso library if available - int auxv_parameters_count = 2; + int auxv_parameters_count = 4; _libvdso = program->get_library("libvdso.so"); if (!_libvdso) { auxv_parameters_count--; WARN_ONCE("application::prepare_argv(): missing libvdso.so -> may prevent shared libraries specifically Golang ones from functioning\n"); } + // Initialize random bytes array so it can be passed as AT_RANDOM auxv vector + if (getrandom(random_bytes, sizeof(random_bytes), 0) != sizeof(random_bytes)) { + // Fall back to rand_r() + auto d = osv::clock::wall::now().time_since_epoch(); + unsigned seed = std::chrono::duration_cast<std::chrono::nanoseconds>(d).count() % 1000000000; + for (unsigned idx = 0; idx < sizeof(random_bytes)/(sizeof(int)); idx++) { + reinterpret_cast<int*>(random_bytes)[idx] = rand_r(&seed); + } + } + // Allocate the continuous buffer for argv[] and envp[] _argv.reset(new char*[_args.size() + 1 + envcount + 1 + sizeof(Elf64_auxv_t) * (auxv_parameters_count + 1)]); @@ -388,7 +401,6 @@ void application::prepare_argv(elf::program *program) } contig_argv[_args.size() + 1 + envcount] = nullptr; - // Pass the VDSO library to the application. Elf64_auxv_t* _auxv = reinterpret_cast<Elf64_auxv_t *>(&contig_argv[_args.size() + 1 + envcount + 1]); @@ -401,6 +413,12 @@ void application::prepare_argv(elf::program *program) _auxv[auxv_idx].a_type = AT_PAGESZ; _auxv[auxv_idx++].a_un.a_val = sysconf(_SC_PAGESIZE); + _auxv[auxv_idx].a_type = AT_MINSIGSTKSZ; + _auxv[auxv_idx++].a_un.a_val = sysconf(_SC_MINSIGSTKSZ); + + _auxv[auxv_idx].a_type = AT_RANDOM; + _auxv[auxv_idx++].a_un.a_val = reinterpret_cast<uint64_t>(random_bytes); + _auxv[auxv_idx].a_type = AT_NULL; _auxv[auxv_idx].a_un.a_val = 0; } -- 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 osv-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/0000000000006aaf8c0603a03e5e%40google.com.