@@ -77,7 +77,7 @@ void *find_symbol_address(const char *symbol_name, Elf64_Ehdr *ehdr, uint64_t of
7777 return NULL ;
7878}
7979
80- dlinit_t load_dynamic (Elf64_Phdr * phdrs , Elf64_Ehdr * ehdr , uint64_t offset ) {
80+ dlinit_t load_dynamic (kernel_mode_t * kmod , Elf64_Phdr * phdrs , Elf64_Ehdr * ehdr , uint64_t offset ) {
8181 Elf64_Dyn * dyn_entry = NULL ;
8282 for (size_t i = 0 ; i < ehdr -> e_phnum ; i ++ ) {
8383 if (phdrs [i ].p_type == PT_DYNAMIC ) {
@@ -142,12 +142,17 @@ dlinit_t load_dynamic(Elf64_Phdr *phdrs, Elf64_Ehdr *ehdr, uint64_t offset) {
142142
143143 void * entry = find_symbol_address ("dlmain" , ehdr , offset );
144144 if (entry == NULL ) { entry = find_symbol_address ("_dlmain" , ehdr , offset ); }
145+ kmod -> entry = entry ;
146+
147+ void * tentry = find_symbol_address ("dlstart" , ehdr , offset );
148+ if (tentry == NULL ) { tentry = find_symbol_address ("_dlstart" , ehdr , offset ); }
149+ kmod -> task_entry = tentry ;
145150
146151 dlinit_t dlinit_func = (dlinit_t )entry ;
147152 return dlinit_func ;
148153}
149154
150- void dlinker_load (cp_module_t * module ) {
155+ void dlinker_load (kernel_mode_t * kmod , cp_module_t * module ) {
151156 if (module == NULL ) return ;
152157
153158 Elf64_Ehdr * ehdr = (Elf64_Ehdr * )module -> data ;
@@ -173,7 +178,7 @@ void dlinker_load(cp_module_t *module) {
173178 }
174179
175180 dlinit_t dlinit =
176- load_dynamic (phdrs , ehdr , KERNEL_MOD_SPACE_START + kernel_modules_load_offset );
181+ load_dynamic (kmod , phdrs , ehdr , KERNEL_MOD_SPACE_START + kernel_modules_load_offset );
177182 if (dlinit == NULL ) {
178183 dlinit = (dlinit_t )ehdr -> e_entry ;
179184 if (dlinit == NULL ) {
@@ -184,7 +189,6 @@ void dlinker_load(cp_module_t *module) {
184189
185190 kinfo ("Loaded module %s at %#018lx" , module -> module_name ,
186191 KERNEL_MOD_SPACE_START + kernel_modules_load_offset );
187-
188192 int ret = dlinit ();
189193
190194 (void )ret ;
0 commit comments