On Fri, Sep 2, 2016 at 5:35 PM, Benoit Canet <[email protected]
> wrote:

> This will allow go program to get the vdso library address.
>
> Signed-off-by: Benoît Canet <[email protected]>
> ---
>  core/app.cc        | 29 ++++++++++++++++++++++++++---
>  include/osv/app.hh |  8 +++++++-
>  2 files changed, 33 insertions(+), 4 deletions(-)
>
> diff --git a/core/app.cc b/core/app.cc
> index 2c3257b..f2665fc 100644
> --- a/core/app.cc
> +++ b/core/app.cc
> @@ -173,7 +173,7 @@ application::application(const std::string& command,
>          }
>
>          merge_in_environ(new_program, env);
> -        prepare_argc_argv();
> +        prepare_argc_argv(current_program);
>          char **argv = _contig_argv.get();
>          std::vector<std::string> extra_path;
>          _lib = current_program->get_library(_command, extra_path, _argc,
> argv);
> @@ -297,7 +297,7 @@ void application::main()
>      // _entry_point() doesn't return
>  }
>
> -void application::prepare_argc_argv()
> +void application::prepare_argc_argv(elf::program *current_program)
>

I don't remember the details, but we also have a _program member in
application, and also a get_program() function, so do we really need to
pass current_program() again?



>  {
>      // C main wants mutable arguments, so we have can't use strings
> directly
>      transform(_args, back_inserter(_mut_args),
> @@ -329,7 +329,7 @@ void application::prepare_argc_argv()
>      while (environ[envcount]) {
>          envcount++;
>      }
> -    _contig_argv.reset(new char*[_argc + 1 + envcount + 1]);
> +    _contig_argv.reset(new char*[_argc + 1 + envcount + 1 + 1]);
>      char **contig_argv = _contig_argv.get();
>
>      for (int i = 0; i < _argc; ++i) {
> @@ -345,6 +345,29 @@ void application::prepare_argc_argv()
>          contig_argv[_argc + 1 + i] = environ[i];
>      }
>      contig_argv[_argc + 1 + envcount] = nullptr;
> +
> +    if (_command == std::string("/zpool.so")       ||
> +        _command == std::string("/libzfs.so")      ||
> +        _command == std::string("/libuutil.so")    ||
> +        _command == std::string("/zfs.so")         ||
> +        _command == std::string("/tools/mkfs.so")  ||
> +        _command == std::string("/tools/cpiod.so")) {
> +        return;
>

What's special about these particular commands?


> +    }
> +
> +    _libvdso = current_program->get_library("libvdso.so");
>
+    if (!_libvdso) {
> +        abort("could not load libvdso.so\n");
> +        return;
> +    }
> +
> +    _auxv[0].a_type = AT_SYSINFO_EHDR;
> +    _auxv[0].a_un.a_val = reinterpret_cast<uint64_t>(_libvdso->base());
>

I'm not very familiar with VDSO details, but must it be a separate shared
library?

Couldn't we give it the kernel's core instead? I.e., use _core instead of
_libvdso. _core->base() exists too - it is normaly ELF_IMAGE_START,  which
is set in the Makefile but defaults to 0x200000, but you wouldn't need to
care about these details, and just use _core->base(). Wouldn't that be
valid too?


> +
> +    _auxv[1].a_type = AT_NULL;
> +    _auxv[1].a_un.a_val = 0;
> +
> +    contig_argv[_argc + 1 + envcount + 1] = reinterpret_cast<char
> *>(_auxv);
>  }
>
>  void application::run_main()
> diff --git a/include/osv/app.hh b/include/osv/app.hh
> index 3ecf1a8..231fb6e 100644
> --- a/include/osv/app.hh
> +++ b/include/osv/app.hh
> @@ -22,6 +22,10 @@
>  #include <unordered_map>
>  #include <string>
>
> +#include "musl/include/elf.h"
>

Why not just #include <elf.h>? We have include/api/elf.h (linking to this
musl file) so that would work.


> +#undef AT_UID // prevent collisions
> +#undef AT_GID
>
+
>  extern "C" void __libc_start_main(int(*)(int, char**), int, char**,
> void(*)(),
>      void(*)(), void(*)(), void*);
>
> @@ -194,7 +198,7 @@ private:
>      void start_and_join(waiter* setup_waiter);
>      void main();
>      void run_main(std::string path, int argc, char** argv);
> -    void prepare_argc_argv();
> +    void prepare_argc_argv(elf::program *current_program);
>      void run_main();
>      friend void ::__libc_start_main(int(*)(int, char**), int, char**,
> void(*)(),
>          void(*)(), void(*)(), void*);
> @@ -211,6 +215,8 @@ private:
>      mutex _termination_mutex;
>      std::shared_ptr<elf::object> _lib;
>      std::shared_ptr<elf::object> _libenviron;
> +    std::shared_ptr<elf::object> _libvdso;
> +    Elf32_auxv_t _auxv[2];
>      main_func_t* _main;
>      void (*_entry_point)();
>      static app_registry apps;
> --
> 2.7.4
>
> --
> 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].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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].
For more options, visit https://groups.google.com/d/optout.

Reply via email to