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

#ifdef CONFIG_UNUSED_SYMBOLS
      /*
  * 获取__ksymtab_unused段的运行时地址,及其存储的
  * 对象的个数。
  */
 mod->unused_syms = section_objs(hdr, sechdrs, secstrings,
     "__ksymtab_unused",
     sizeof(*mod->unused_syms),
     &mod->num_unused_syms);
 /*
  * 获取__kcrctab_unused段的运行时地址。
  */
 mod->unused_crcs = section_addr(hdr, sechdrs, secstrings,
     "__kcrctab_unused");
      /*
  * 获取__ksymtab_unused_gpl段的运行时地址,及其存储的
  * 对象的个数。
  */
 mod->unused_gpl_syms = section_objs(hdr, sechdrs, secstrings,
        "__ksymtab_unused_gpl",
        sizeof(*mod->unused_gpl_syms),
        &mod->num_unused_gpl_syms);
 /*
  * 获取__kcrctab_unused_gpl段的运行时地址。
  */
 mod->unused_gpl_crcs = section_addr(hdr, sechdrs, secstrings,
        "__kcrctab_unused_gpl");
#endif
#ifdef CONFIG_CONSTRUCTORS
      /*
  * 获取.ctors段的运行时地址,及其存储的
  * 对象的个数。
  */
 mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
      sizeof(*mod->ctors), &mod->num_ctors);
#endif

#ifdef CONFIG_TRACEPOINTS
        /*
  * 获取__tracepoints段的运行时地址,及其存储的
  * 对象的个数。
  */
 mod->tracepoints = section_objs(hdr, sechdrs, secstrings,
     "__tracepoints",
     sizeof(*mod->tracepoints),
     &mod->num_tracepoints);
#endif
#ifdef CONFIG_EVENT_TRACING
      /*
  * 获取_ftrace_events段的运行时地址,及其存储的
  * 对象的个数。
  */
 mod->trace_events = section_objs(hdr, sechdrs, secstrings,
      "_ftrace_events",
      sizeof(*mod->trace_events),
      &mod->num_trace_events);
#endif
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
 /* sechdrs[0].sh_size is always zero */
 /*
  * 获取__mcount_loc段的运行时地址,及其存储的
  * 对象的个数。
  */
 mod->ftrace_callsites = section_objs(hdr, sechdrs, secstrings,
          "__mcount_loc",
          sizeof(*mod->ftrace_callsites),
          &mod->num_ftrace_callsites);
#endif
#ifdef CONFIG_MODVERSIONS
 if ((mod->num_syms && !mod->crcs)
    || (mod->num_gpl_syms && !mod->gpl_crcs)
    || (mod->num_gpl_future_syms && !mod->gpl_future_crcs)
#ifdef CONFIG_UNUSED_SYMBOLS
    || (mod->num_unused_syms && !mod->unused_crcs)
    || (mod->num_unused_gpl_syms && !mod->unused_gpl_crcs)
#endif
  ) {
  err = try_to_force_load(mod,
     "no versions for exported symbols");
  if (err)
   goto cleanup;
 }
#endif

/* Now do relocations. */
 for (i = 1; i < hdr->e_shnum; i++) {
  const char *strtab = (char *)sechdrs[strindex].sh_addr;
  unsigned int info = sechdrs[i].sh_info;

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

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