Pass argc/argv/envp to dso constructors
The glibc implementation of the loader passes argc/argv/envp
to all elf constructors. This change makes bionic linker
behave in the same way.
Bug: http://b/30145768
Change-Id: I1c65c42aa5305a5b133c64b5748205bbde869e0e
Test: run bionic-unit-tests --gtest_filter=dl*:Dl*
diff --git a/linker/linker.h b/linker/linker.h
index fd437aa..d8c0e19 100644
--- a/linker/linker.h
+++ b/linker/linker.h
@@ -96,7 +96,8 @@
#define SOINFO_NAME_LEN 128
#endif
-typedef void (*linker_function_t)();
+typedef void (*linker_dtor_function_t)();
+typedef void (*linker_ctor_function_t)(int, char**, char**);
// Android uses RELA for aarch64 and x86_64. mips64 still uses REL.
#if defined(__aarch64__) || defined(__x86_64__)
@@ -234,16 +235,16 @@
size_t rel_count_;
#endif
- linker_function_t* preinit_array_;
+ linker_ctor_function_t* preinit_array_;
size_t preinit_array_count_;
- linker_function_t* init_array_;
+ linker_ctor_function_t* init_array_;
size_t init_array_count_;
- linker_function_t* fini_array_;
+ linker_dtor_function_t* fini_array_;
size_t fini_array_count_;
- linker_function_t init_func_;
- linker_function_t fini_func_;
+ linker_ctor_function_t init_func_;
+ linker_dtor_function_t fini_func_;
#if defined(__arm__)
public:
@@ -373,8 +374,6 @@
bool lookup_version_info(const VersionTracker& version_tracker, ElfW(Word) sym,
const char* sym_name, const version_info** vi);
- void call_array(const char* array_name, linker_function_t* functions, size_t count, bool reverse);
- void call_function(const char* function_name, linker_function_t function);
template<typename ElfRelIteratorT>
bool relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& rel_iterator,
const soinfo_list_t& global_group, const soinfo_list_t& local_group);