Linux内核模块的加载过程(7)

/*
  * 在sysfs中创建模块相应的项
  */
 err = mod_sysfs_setup(mod, mod->kp, mod->num_kp);
 if (err < 0)
  goto unlink;
 /*
  * 添加段属性
  */
 add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs);
 /*
  * 添加注解属性
  */
 add_notes_attrs(mod, hdr->e_shnum, secstrings, sechdrs);

/* Get rid of temporary copy */
 vfree(hdr);

trace_module_load(mod);

/* Done! */
 return mod;

unlink:
 /* Unlink carefully: kallsyms could be walking list. */
 list_del_rcu(&mod->list);
 synchronize_sched();
 module_arch_cleanup(mod);
 cleanup:
 free_modinfo(mod);
 kobject_del(&mod->mkobj.kobj);
 kobject_put(&mod->mkobj.kobj);
 free_unload:
 module_unload_free(mod);
#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
 percpu_modfree(mod->refptr);
 free_init:
#endif
 module_free(mod, mod->module_init);
 free_core:
 module_free(mod, mod->module_core);
 /* mod will be freed with core. Don't access it beyond this line! */
 free_percpu:
 if (percpu)
  percpu_modfree(percpu);
 free_mod:
 kfree(args);
 kfree(strmap);
 free_hdr:
 vfree(hdr);
 return ERR_PTR(err);

truncated:
 printk(KERN_ERR "Module len %lu truncated\n", len);
 err = -ENOEXEC;
 goto free_hdr;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/bf168a7a8c38771e643a5f406db5752c.html