设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Linux 程序设计专题讨论
›
定位共享库中的函数----接xueyan的动态连接作业 ...
返回列表
查看:
3646
|
回复:
6
定位共享库中的函数----接xueyan的动态连接作业
[复制链接]
rickxbx
rickxbx
当前离线
积分
1256
IP卡
狗仔卡
发表于 2005-7-21 12:08:53
|
显示全部楼层
|
阅读模式
应用程序是如何找到共享库中的相关函数的呢?
下面的程序解释了定位printf函数的过程(前面与got,plt相关的部分省略)
#include <stdio.h>
#include <elf.h>
#include <stdlib.h>
#include <link.h>
typedef void (*func)(char*);
unsigned long elf_hash(const unsigned char* name)
{
unsigned long h = 0,g;
while(*name)
{
h = (h<<4)+*name++;
if(g=h&0xf0000000)
h ^= g>>24;
h&=~g;
}
return h;
}
int main()
{
Elf32_Ehdr* load_addr = (Elf32_Ehdr*)0x8048000;
Elf32_Phdr* phdr;
Elf32_Dyn* dyn;
struct link_map* l;
unsigned int strtab;
Elf32_Sym* sym,*symtab;
unsigned long hashtab;
phdr = (Elf32_Phdr*)(0x8048000+load_addr->e_phoff);
int i = 0;
for(;i<load_addr->e_phnum;i++)
{
if(phdr->p_type==PT_DYNAMIC)
break;
phdr++;
}
dyn = (Elf32_Dyn*)phdr->p_vaddr;
for(i=0;i<phdr->p_memsz/sizeof(Elf32_Dyn);i++)
{
if(dyn->d_tag==DT_PLTGOT)
break;
dyn++;
}
l = (struct link_map*)*(unsigned int*)((unsigned long)dyn->d_un.d_ptr+4);
while(l)
{
dyn = (Elf32_Dyn*)l->l_ld;
while(dyn->d_tag)
{
if(dyn->d_tag==DT_STRTAB)
{
strtab = dyn->d_un.d_ptr;
}
if(dyn->d_tag==DT_SYMTAB)
{
symtab = (Elf32_Sym*)dyn->d_un.d_ptr;
}
if(dyn->d_tag==DT_HASH)
{
hashtab = dyn->d_un.d_ptr;
}
dyn++;
}
unsigned long nbucket = *(unsigned long*)hashtab;
unsigned long nchains = *(unsigned long*)(hashtab+4);
unsigned long* bucket = (unsigned long*)(hashtab+8);
unsigned long* chain = (unsigned long*)(hashtab+8+nbucket*4);
i = bucket[elf_hash("printf")%nbucket];
sym = symtab + i;
while(strcmp("printf",(char*)sym->st_name+strtab))
{
i = chain[i];
sym = symtab+i;
if(!sym->st_name)
break;
}
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)
break;
l = l->l_next;
}
((func)(sym->st_value+l->l_addr))("haha\n");
}
复制代码
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
kj501
kj501
当前离线
积分
5317
IP卡
狗仔卡
发表于 2005-7-23 17:54:55
|
显示全部楼层
呵呵,三日不见,对rickxbx兄当刮目相看了。
不过程序最好加上一点注释,好让人容易理解。
回复
支持
反对
使用道具
举报
显身卡
rickxbx
rickxbx
当前离线
积分
1256
IP卡
狗仔卡
楼主
|
发表于 2005-7-23 18:03:53
|
显示全部楼层
Post by
kj501
呵呵,三日不见,对rickxbx兄当刮目相看了。
不过程序最好加上一点注释,好让人容易理解。
晕,你看我在这换头像,就知道我有多无聊了
kj有什么项目可以做啊? 我不要钱的 ^_^
回复
支持
反对
使用道具
举报
显身卡
kj501
kj501
当前离线
积分
5317
IP卡
狗仔卡
发表于 2005-7-25 16:17:27
|
显示全部楼层
你不是在公司打工吗?怎么有时间做私活?不怕老板把你给炒了?
如果确实精力过剩,可以到网上申请加入一个开源项目做做。
回复
支持
反对
使用道具
举报
显身卡
smallpeg
smallpeg
当前离线
积分
77
IP卡
狗仔卡
发表于 2005-12-31 10:29:03
|
显示全部楼层
请问在网上怎么申请参加呢?
回复
支持
反对
使用道具
举报
显身卡
lsajeff
lsajeff
当前离线
积分
1
IP卡
狗仔卡
发表于 2008-6-30 15:37:09
|
显示全部楼层
没有注释,完全看不懂了.
回复
支持
反对
使用道具
举报
显身卡
sinanjj
sinanjj
当前离线
积分
126
IP卡
狗仔卡
发表于 2009-5-3 16:14:36
|
显示全部楼层
先看elf格式说明就看懂了。
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表