This is required by go runtime initialization.

Signed-off-by: Benoît Canet <[email protected]>
---
 core/app.cc        |  2 +-
 core/elf.cc        | 12 ++++++------
 include/osv/elf.hh |  4 ++--
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/core/app.cc b/core/app.cc
index 0bfcedd..ad8018c 100644
--- a/core/app.cc
+++ b/core/app.cc
@@ -279,7 +279,7 @@ void application::main()
 {
     __libc_stack_end = __builtin_frame_address(0);
 
-    elf::get_program()->init_library();
+    elf::get_program()->init_library(_args.size(), _argv.get());
     sched::thread::current()->set_name(_command);
 
     if (_main) {
diff --git a/core/elf.cc b/core/elf.cc
index bf2137c..3dddc48 100644
--- a/core/elf.cc
+++ b/core/elf.cc
@@ -928,19 +928,19 @@ std::string object::pathname()
 }
 
 // Run the object's static constructors or similar initialization
-void object::run_init_funcs()
+void object::run_init_funcs(int argc, char** argv)
 {
     if (dynamic_exists(DT_INIT)) {
         auto func = dynamic_ptr<void>(DT_INIT);
         if (func) {
-            reinterpret_cast<void(*)()>(func)();
+            reinterpret_cast<void(*)(int, char**)>(func)(argc, argv);
         }
     }
     if (dynamic_exists(DT_INIT_ARRAY)) {
-        auto funcs = dynamic_ptr<void (*)()>(DT_INIT_ARRAY);
+        auto funcs = dynamic_ptr<void(*)(int, char**)>(DT_INIT_ARRAY);
         auto nr = dynamic_val(DT_INIT_ARRAYSZ) / sizeof(*funcs);
         for (auto i = 0u; i < nr; ++i) {
-            funcs[i]();
+            funcs[i](argc, argv);
         }
     }
 }
@@ -1200,7 +1200,7 @@ program::get_library(std::string name, 
std::vector<std::string> extra_path, bool
     return ret;
 }
 
-void program::init_library()
+void program::init_library(int argc, char** argv)
 {
     // get the list of weak pointers before iterating on them
     std::vector<std::weak_ptr<object>> weak_objects =
@@ -1212,7 +1212,7 @@ void program::init_library()
     auto size = weak_objects.size();
     for (int i = size - 1; i >= 0; i--) {
        if (auto obj = weak_objects[i].lock()) {
-            obj->run_init_funcs();
+            obj->run_init_funcs(argc, argv);
         }
     }
     for (unsigned i = 0; i < size; i++) {
diff --git a/include/osv/elf.hh b/include/osv/elf.hh
index d26b22c..90eb8a9 100644
--- a/include/osv/elf.hh
+++ b/include/osv/elf.hh
@@ -335,7 +335,7 @@ public:
     const std::vector<Elf64_Phdr> *phdrs();
     std::string soname();
     std::string pathname();
-    void run_init_funcs();
+    void run_init_funcs(int argc, char** argv);
     void run_fini_funcs();
     template <typename T = void>
     T* lookup(const char* name);
@@ -528,7 +528,7 @@ public:
     std::shared_ptr<elf::object>
     get_library(std::string lib, std::vector<std::string> extra_path = {}, 
bool no_init = false);
 
-    void init_library();
+    void init_library(int argc = 0, char **argv = nullptr);
 
     /**
      * Set the default search path for get_library().
-- 
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.

Reply via email to