@@ -102,6 +102,11 @@ int load_module(char** argv)
102102 modules = list_create ();
103103
104104 FILE * f = file_open (argv [0 ], OPEN_RDONLY );
105+
106+ if (f == NULL )
107+ kernel_panic ("Given module does not exist!" );
108+
109+
105110 uint32_t mod_sz = vfs_getFileSize (f );
106111
107112 uint8_t * buf = zalloc (mod_sz );
@@ -147,7 +152,7 @@ int load_module(char** argv)
147152 else
148153 {
149154 shdr -> sh_addr = (buf + shdr -> sh_offset );
150- serialprintf ( " SHDR %d: 0x%x\n " , i , shdr -> sh_addr );
155+ ldprintf ( "Module loader" , LOG_DEBUG , " SHDR %d: 0x%x" , i , shdr -> sh_addr );
151156 }
152157 }
153158
@@ -179,21 +184,28 @@ int load_module(char** argv)
179184 {
180185 elf_section_header_t * sym_shdr = (buf + (head -> e_shoff + (head -> e_shentsize * symtab [s ].st_shndx )));
181186 symtab [s ].st_value = symtab [s ].st_value + sym_shdr -> sh_addr ;
182- serialprintf ( "SYM: %s : 0x%x\n " , & (strtab [symtab [s ].st_name ]), symtab [s ].st_value );
187+ ldprintf ( "Module loader" , LOG_DEBUG , "LOCAL %s : 0x%x %dB " , & (strtab [symtab [s ].st_name ]), symtab [s ].st_value , symtab [ s ]. st_size );
183188 }
184189 else if (symtab [s ].st_shndx == SHN_UNDEF ) // Kernel symbol
185190 {
186- serialprintf ("STRTAB: 0x%x\n" , strtab );
187- serialprintf ("SYMTAB: 0x%x\n" , symtab );
188- serialprintf ("SYM: %s\n" , & (strtab [symtab [s ].st_name ]));
189- symtab [s ].st_value = (uintptr_t )get_kernel_symbol_by_name (& (strtab [symtab [s ].st_name ]));
191+ if (strcmp (& (strtab [symtab [s ].st_name ]), "" ) == 0 )
192+ continue ;
193+
194+ symbol_t * sym = get_kernel_symbol_by_name (& (strtab [symtab [s ].st_name ]));
195+ if (sym == NULL )
196+ {
197+ ldprintf ("Module loader" , LOG_ERR , "Cannot resolve symbol named %s from the list of kernel symbols" , & (strtab [symtab [s ].st_name ]));
198+ kernel_panic ("Cannot resolve kernel symbols present in module" );
199+ }
200+ symtab [s ].st_value = (uintptr_t )sym -> addr ;
201+ symtab [s ].st_size = sym -> size ;
202+ ldprintf ("Module loader" , LOG_DEBUG , "%s: 0x%x %dB" , & (strtab [symtab [s ].st_name ]), symtab [s ].st_value , symtab [s ].st_size );
190203 }
191204 add_sym_to_modentry (strdup (& (strtab [symtab [s ].st_name ])), symtab [s ].st_value , symtab [s ].st_size , mod_entry );
192205 if (symtab [s ].st_name && (strcmp (& (strtab [symtab [s ].st_name ]), "metadata" ) == 0 ))
193206 {
194207 mod_info = (void * )symtab [s ].st_value ;
195208 mod_entry -> info = mod_info ;
196- serialprintf ("MOD_INFO: 0x%x\n" , mod_info );
197209 }
198210 sym_num ++ ;
199211 }
@@ -238,7 +250,7 @@ int load_module(char** argv)
238250 ptr = (rel_table -> r_offset + r_section -> sh_addr );
239251 A = * ptr ;
240252 P = (uintptr_t )ptr ;
241- ldprintf ("Module loader" , LOG_INFO , "Using symbol %s" , name );
253+ ldprintf ("Module loader" , LOG_DEBUG , "Using symbol %s" , name );
242254 if (!get_module_symbol_by_name (name , symtab , strtab , sym_num ))
243255 {
244256 if (get_kernel_symbol_by_name (name ))
@@ -260,11 +272,12 @@ int load_module(char** argv)
260272 {
261273 case R_386_32 :
262274 * ptr = A + S ;
263- serialprintf ( " 0x%x = 0x%x + 0x%x\n " , * ptr , A , S );
275+ ldprintf ( "Module loader" , LOG_DEBUG , "'R_386_32' 0x%x = 0x%x + 0x%x" , * ptr , A , S );
264276 break ;
265277 case R_386_PC32 :
266278 * ptr = A + S - P ;
267279 serialprintf ("0x%x = 0x%x + 0x%x - 0x%x\n" , * ptr , A , S , P );
280+ ldprintf ("Module loader" , LOG_DEBUG , "'R_386_PC32' 0x%x = 0x%x + 0x%x - 0x%x" , * ptr , A , S , P );
268281 break ;
269282 default :
270283 ldprintf ("Module loader" , LOG_ERR , "Unsupported reallocation %d found" , ELF32_R_TYPE (rel_table [rel ].r_info ));
@@ -281,19 +294,14 @@ int load_module(char** argv)
281294 int argc = 0 ;
282295 for (char * * aa = argv ; * aa ; ++ aa ) ++ argc ;
283296
284- serialprintf ("Got symbols:\n" );
285297 module_init * init = NULL ;
286298 foreach (g , mod_entry -> symbols )
287299 {
288300 symbol_t * s = g -> val ;
289- serialprintf ("\t-%s: 0x%x 0x%x\n" , s -> name , s -> addr , s -> size );
290- if (strcmp (s -> name , "init" ) == 0 )
291- {
292- init = 0xc1893310 ;
293- }
301+ ldprintf ("Module loader" , LOG_DEBUG , "%s: 0x%x 0x%x" , s -> name , s -> addr , s -> size );
294302 }
295303
296304 xxd (mod_info , sizeof (module_info_t ));
297305 ldprintf ("Module loader" , LOG_INFO , "Initializing module: %s" , mod_info -> name );
298- return ( * (( module_init * ) 0x8312663d )) (argc , argv );
306+ return mod_info -> init (argc , argv );
299307}
0 commit comments