LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3646|回复: 6

定位共享库中的函数----接xueyan的动态连接作业

[复制链接]
发表于 2005-7-21 12:08:53 | 显示全部楼层 |阅读模式
应用程序是如何找到共享库中的相关函数的呢?
下面的程序解释了定位printf函数的过程(前面与got,plt相关的部分省略)

  1. #include <stdio.h>
  2. #include <elf.h>
  3. #include <stdlib.h>
  4. #include <link.h>

  5. typedef void (*func)(char*);

  6. unsigned long elf_hash(const unsigned char* name)
  7. {
  8.         unsigned long h = 0,g;

  9.         while(*name)
  10.         {
  11.                 h = (h<<4)+*name++;
  12.                 if(g=h&0xf0000000)
  13.                         h ^= g>>24;
  14.                 h&=~g;
  15.         }

  16.         return h;
  17. }

  18. int main()
  19. {
  20.         Elf32_Ehdr* load_addr = (Elf32_Ehdr*)0x8048000;
  21.         Elf32_Phdr* phdr;
  22.         Elf32_Dyn* dyn;
  23.         struct link_map* l;
  24.         unsigned int strtab;
  25.         Elf32_Sym* sym,*symtab;
  26.         unsigned long hashtab;
  27.        
  28.         phdr = (Elf32_Phdr*)(0x8048000+load_addr->e_phoff);
  29.        
  30.         int i = 0;
  31.         for(;i<load_addr->e_phnum;i++)
  32.         {
  33.                        
  34.                 if(phdr->p_type==PT_DYNAMIC)
  35.                         break;

  36.                 phdr++;
  37.         }

  38.         dyn = (Elf32_Dyn*)phdr->p_vaddr;

  39.         for(i=0;i<phdr->p_memsz/sizeof(Elf32_Dyn);i++)
  40.         {
  41.                 if(dyn->d_tag==DT_PLTGOT)
  42.                         break;

  43.                 dyn++;
  44.         }

  45.         l = (struct link_map*)*(unsigned int*)((unsigned long)dyn->d_un.d_ptr+4);
  46.        
  47.         while(l)
  48.         {               
  49.                 dyn = (Elf32_Dyn*)l->l_ld;
  50.        
  51.                 while(dyn->d_tag)
  52.                 {
  53.                         if(dyn->d_tag==DT_STRTAB)
  54.                         {
  55.                                 strtab = dyn->d_un.d_ptr;
  56.                         }
  57.                
  58.                         if(dyn->d_tag==DT_SYMTAB)
  59.                         {
  60.                                 symtab = (Elf32_Sym*)dyn->d_un.d_ptr;
  61.                         }

  62.                         if(dyn->d_tag==DT_HASH)
  63.                         {
  64.                                 hashtab = dyn->d_un.d_ptr;
  65.                         }
  66.                         dyn++;
  67.                 }
  68.        
  69.                 unsigned long nbucket = *(unsigned long*)hashtab;
  70.                 unsigned long nchains = *(unsigned long*)(hashtab+4);
  71.                 unsigned long* bucket = (unsigned long*)(hashtab+8);
  72.                 unsigned long* chain = (unsigned long*)(hashtab+8+nbucket*4);

  73.                 i = bucket[elf_hash("printf")%nbucket];
  74.                 sym = symtab + i;
  75.        
  76.                 while(strcmp("printf",(char*)sym->st_name+strtab))
  77.                 {
  78.                         i = chain[i];
  79.                         sym = symtab+i;
  80.                         if(!sym->st_name)
  81.                                 break;
  82.                 }
  83.                                
  84.                 if(!strcmp("printf",(char*)sym->st_name+strtab) && sym->st_shndx!=SHN_UNDEF && ELF32_ST_BIND(sym->st_info)==STB_GLOBAL && ELF32_ST_TYPE(sym->st_info)==STT_FUNC)
  85.                         break;

  86.                 l = l->l_next;
  87.         }
  88.        
  89.         ((func)(sym->st_value+l->l_addr))("haha\n");
  90. }


复制代码
发表于 2005-7-23 17:54:55 | 显示全部楼层
呵呵,三日不见,对rickxbx兄当刮目相看了。
不过程序最好加上一点注释,好让人容易理解。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-23 18:03:53 | 显示全部楼层
Post by kj501
呵呵,三日不见,对rickxbx兄当刮目相看了。
不过程序最好加上一点注释,好让人容易理解。

晕,你看我在这换头像,就知道我有多无聊了
kj有什么项目可以做啊? 我不要钱的 ^_^
回复 支持 反对

使用道具 举报

发表于 2005-7-25 16:17:27 | 显示全部楼层
你不是在公司打工吗?怎么有时间做私活?不怕老板把你给炒了?
如果确实精力过剩,可以到网上申请加入一个开源项目做做。
回复 支持 反对

使用道具 举报

发表于 2005-12-31 10:29:03 | 显示全部楼层
请问在网上怎么申请参加呢?
回复 支持 反对

使用道具 举报

发表于 2008-6-30 15:37:09 | 显示全部楼层
没有注释,完全看不懂了.
回复 支持 反对

使用道具 举报

发表于 2009-5-3 16:14:36 | 显示全部楼层
先看elf格式说明就看懂了。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表