免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2461 | 回复: 8
打印 上一主题 下一主题

[内核模块] 关于符号表的疑问。。。 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-30 10:47 |只看该作者 |倒序浏览
5可用积分
本帖最后由 chishanmingshen 于 2014-03-22 19:24 编辑

公认:"sh_entsize: 有些section包含的是一组固定大小表项的表,例如符号表,对于这样的section,该成员给出了每个表项的尺寸大小。如果section不包括这样的内容,则该值为0 。"

可是看代码,这个字段一直表示的都是该section相对于CORE/INIT section的偏移啊。。。难道只是临时的?

求指点,谢谢!

from 3.12.14
  1. /* Lay out the SHF_ALLOC sections in a way not dissimilar to how ld
  2.    might -- code, read-only data, read-write data, small data.  Tally
  3.    sizes, and place the offsets into sh_entsize fields: high bit means it
  4.    belongs in init. */
  5. static void layout_sections(struct module *mod, const Elf_Ehdr * hdr,
  6.                 Elf_Shdr * sechdrs, const char *secstrings)
  7. {
  8.     static unsigned long const masks[][2] = {
  9.         /* NOTE: all executable code must be the first section
  10.          * in this array; otherwise modify the text_size
  11.          * finder in the two loops below */
  12.         {SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL},
  13.         {SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL},
  14.         {SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL},
  15.         {ARCH_SHF_SMALL | SHF_ALLOC, 0}
  16.     };
  17.     unsigned int m, i;

  18.     for (i = 0; i < hdr->e_shnum; i++)
  19.         sechdrs[i].sh_entsize = ~0UL;

  20.     for (m = 0; m < ARRAY_SIZE(masks); ++m) {
  21.         for (i = 0; i < hdr->e_shnum; ++i) {
  22.             Elf_Shdr *s = &sechdrs[i];

  23.             //  || strncmp(secstrings + s->sh_name, ".init", 5) == 0)
  24.             if ((s->sh_flags & masks[m][0]) != masks[m][0]
  25.                 || (s->sh_flags & masks[m][1])
  26.                 || s->sh_entsize != ~0UL)
  27.                 continue;
  28.             s->sh_entsize =《----------------------------------------------------------
  29.                 get_offset((unsigned long *)&mod->core_size, s);
  30.         }

  31.         if (m == 0)
  32.             mod->core_text_size = mod->core_size;

  33.     }
  34. }
复制代码
求解,谢谢!

最佳答案

查看完整内容

这个很明显是挪用,因为这个字段作为标准是有意义的,但对内核来说没有意义。对于特性的程序,各个段的数据项大小早已是固定的大小的了,没必要从sh_entsize读回来,你想想,如果真读出来的值和内核对应的结构体长度不一样,内核情何以堪,接下去该如何处理??这是不可能的,因此sh_entsize这个值对内核没有意义。因此挪用来存在这个段在CORE里头的偏移量。CORE这个空间是内核自己弄出来的,得找个地方存着它和每个需要分配内存( ...

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2013-03-30 10:47 |只看该作者
这个很明显是挪用,因为这个字段作为标准是有意义的,但对内核来说没有意义。对于特性的程序,各个段的数据项大小早已是固定的大小的了,没必要从sh_entsize读回来,你想想,如果真读出来的值和内核对应的结构体长度不一样,内核情何以堪,接下去该如何处理??这是不可能的,因此sh_entsize这个值对内核没有意义。
因此挪用来存在这个段在CORE里头的偏移量。CORE这个空间是内核自己弄出来的,得找个地方存着它和每个需要分配内存(SHF_ALLOC)的段的关系。

从下面代码段可以看到,无论是数据项的个数或是数据项的大小,都没有从ELF上去获取。

static unsigned long layout_symtab(struct module *mod,
                                   Elf_Shdr *sechdrs,
                                   unsigned int symindex,
                                   unsigned int strindex,
                                   const Elf_Ehdr *hdr,
                                   const char *secstrings,
                                   unsigned long *pstroffs,
                                   unsigned long *strmap)
{
        unsigned long symoffs;
        Elf_Shdr *symsect = sechdrs + symindex;
        Elf_Shdr *strsect = sechdrs + strindex;
        const Elf_Sym *src;
        const char *strtab;
        unsigned int i, nsrc, ndst;

        /* Put symbol section at end of init part of module. */
        symsect->sh_flags |= SHF_ALLOC;
        symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect,
                                         symindex) | INIT_OFFSET_MASK;
        DEBUGP("\t%s\n", secstrings + symsect->sh_name);

        src = (void *)hdr + symsect->sh_offset;
        nsrc = symsect->sh_size / sizeof(*src);  《——————————————————————————


这种不按标准的小窍门是容把人给弄昏。
你也可以搜一下代码,sh_entsize这个值,内核重来就没有当过是每项大小用过。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-04-08 10:28 |只看该作者
求解。。。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-04-12 13:40 |只看该作者
求解。。。。:wink:

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
5 [报告]
发表于 2013-04-12 13:57 |只看该作者
之前看过,现在记不清了。

http://ishare.iask.sina.com.cn/f/17163588.html

这本书的附录,有讲解。
你可以看看。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-04-13 10:07 |只看该作者
书上讲不到代码层次~~~还得求解!

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2014-03-21 23:20 |只看该作者
一年了。。。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2014-03-24 08:35 |只看该作者
回复 2# Tinnal

谢谢!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP