返回   cpper编程论坛 > 技术杂烩
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

技术杂烩 找不到地方的技术问题?这里!

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2004-07-08
codinggirl 的头像
高级会员
 
注册日期: 2002-09-16
帖子: 1,052
codinggirl 正向着好的方向发展
默认 ACE Service Configurator框架和C语言的“反射”---ZT

代码:
ACE的服务配置框架,是一个非常强大的框架,采用它可以使应用根据相应配置文件进行有选择的服务启动,应用可以重新配置其服务,而无需重新编译或是重新启动应用本身。对于电信领域中的应用,该框架功能确实是非常棒的优点。但是,对于静态类型的服务,也就是说相应的函数是静态的编译到应用中的,ACE一般在主程序中都要用ACE_STATIC_SVC_REQUIRE和ACE_STATIC_SVC_REGISTER来向ACE_Service_Repository登记静态服务,这就造成了主程序和服务之间还存在一定的耦合。当然,对于静态服务这么做没有任何问题。但是,这多多少少让我觉得不爽,这里我是一个极端主义者^_^,我想让我的主程序完全是通过配置文件来启动静态服务的,在代码上主程序和服务完全没有耦合! 在JAVA里,可以通过一个类的名字来获得该类本身。我不太熟悉JAVA^_^,JAVA中的反射大概是这个意思。为了满足上面的要求,主程序完全通过配置文件来启动静态服务,也就是说我们要根据函数的名字来得到相应的函数(对于通过共享库动态加载的服务,我们可以通过dlopen,dlsym等函数,很容易的从函数名字导出函数本身。ACE底层实现,也是通过这样的方式,来动态加载服务的),因此我在标题里写了C语言的“反射”^_^。在C和C++里,我们从语言的角度上,我们没有办法这样做。 俗话说:天无绝人之路。没有C做不到的事情(C是能做到,但是很多时候我做不到,因为我的水平还很差^_^)。这里我们可以通过解析ELF文件格式,很轻松的从函数的名字来得到函数本身,代码如下(该代码只是一个简单的演示): 文件名:parse.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <libelf.h> #include <gelf.h> void test(int i) { printf("oh, come on baby\n"); printf("the i is %d\n",i); } int main(int argc, char **argv) { Elf *elf = NULL; Elf_Scn *scn = NULL; GElf_Shdr shdr; Elf_Data *data = NULL; int fd, ii, count; void (*func)(int); elf_version(EV_CURRENT); fd = open(argv[1], O_RDONLY); elf = elf_begin(fd, ELF_C_READ, NULL); while ((scn = elf_nextscn(elf, scn)) != NULL) { gelf_getshdr(scn, &shdr); if (shdr.sh_type == SHT_SYMTAB) { /* found a symbol table, go print it. */ break; } } data = elf_getdata(scn, NULL); count = shdr.sh_size / shdr.sh_entsize; for (ii=0; ii < count; ++ii) { GElf_Sym sym; gelf_getsym(data, ii, &sym); if(!strcmp("test", elf_strptr(elf, shdr.sh_link, sym.st_name))){ func = (void (*)(int))(unsigned long)(sym.st_value& 0xffffffff);//得到函数名字对应的函数地址 func(7); } } elf_end(elf); close(fd); } 编译:gcc -o parse parse.c -lelf 运行:parse parse 通过上面这种手段,我们从函数的名字得到了相应的函数。该代码在solaris上编译运行通过。网络上通过解析ELF进行程序hack的例子不少,我这里简单的解析ELF,拿来正道之用,也可谓是名门正派了。(别仍鸡蛋呀^_^) 其实,很多东西就是一种思路,我没有看ACE的时候,从来没有想到过通过配置文件来进行服务的选择启动。当我看了ACE后,就说:“喔,原来程序可以这样”,并且通过自己的发散思维,可以进一步考虑出一些东西。哎。。。,看来自己要学的东西还很多呀,自己还是一个嫩黄瓜^_^。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2004-07-08
高级会员
 
注册日期: 2002-09-10
帖子: 269
文章: 1
panda 正向着好的方向发展
发送 MSN 消息给 panda
默认

看了半天,简而言之是不是我程序拿到这个字符串,根据这个字符串去找对应的函数。由于没有function table(或许也8可能有),怎么办呢?野蛮施工,分析elf文件强行获取地址。阿是这个意思的说?
nm -SAn *.o | grep function_name (偶平时是这么做的,因为要看函数在那个.o里出现可以问日本人要source code)。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2004-07-08
初级会员
 
注册日期: 2004-06-28
帖子: 27
猛禽 正向着好的方向发展
默认

这也是CSDN的文章啊,CG怎么变文抄G了?

不过我觉得这个方法不好,太野蛮了,而且只能用于ELF格式。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2004-07-08
Innocentius 的头像
版主
 
注册日期: 2002-09-11
住址: 上海
帖子: 562
文章: 12
Innocentius 正向着好的方向发展
发送 MSN 消息给 Innocentius
默认

在 Windows 下就没有类似的做法,除非:

1、从 EXE/DLL 里面导出列表
2、包含DEBUG信息,然后从DEBUG信息里面找出有用的东西
3、分析 MAP 文件,根据地址找出函数

我觉得第三种做法是比较实际的,如果按照上面文章的思路的话。

不过话说回来,如果仔细分析 MAP 文件,确实可以做到与上面文件类似的功能,并且工作量不算大。Windows 下常见的编译型语言,比如说 FORTRAN、C、C++、PASCAL,都可以生成格式类似的 MAP 文件,然后在写一个小程序,在POST-BUILD阶段分析 MAP,就可以得到一个符号表作为一个数据文件,供运行时候读入。我记得以前的 SYMDEB 好像就是用这个方法进行调试的。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2004-07-09
Elminster 的头像
超级版主
 
注册日期: 2002-09-09
帖子: 1,764
Elminster 正向着好的方向发展
默认

这种东西是应该放到系统里去的,就像微软的 COM。如果要自己做的话,最好还是两边做点约定。解析 ELF 也不失为一种办法,但总觉得不是正道。

PS:这几篇文章为何放到这边来?怎么看都应该放在 C++ 么。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2004-07-09
普通会员
 
注册日期: 2003-09-10
住址: 重庆
帖子: 35
merlinran 正向着好的方向发展
发送 MSN 消息给 merlinran
默认

这是Huihoo Power!的一位仁兄在他的BLOG里首先发表的。CSDN的版本没见过,不知道是不是作者自己所贴。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2004-07-09
codinggirl 的头像
高级会员
 
注册日期: 2002-09-16
帖子: 1,052
codinggirl 正向着好的方向发展
默认

引用:
作者: 猛禽
这也是CSDN的文章啊,CG怎么变文抄G了?
不过我觉得这个方法不好,太野蛮了,而且只能用于ELF格式。
这两天在看《C++网络编程》,顺便看看其他人的学习心得,觉得有点指导意义所以贴了上来。文抄G?自己写不出来抄抄也好 我是在CSDN里看到的这篇文章,署名是 zhanghx6986 [原作] ,但不知道是否就是原作者本人,CSDN里的连接如下:
http://dev.csdn.net/develop/article/27/27734.shtm

虽然方法野蛮了点,但实在想不出其他好方法的情况下,用野蛮方法解决问题也行(难道在项目开发中,野蛮方法有人敢说从没用过?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用


相似的主题
主题 主题作者 版面 回复 最后发表
谁有一次构建脚本的例子,什么脚本语言都可以 SpitFire C/CPP/TMP/GP 5 2006-11-23 12:23 AM
[普通]ACE目录结构介绍--ZT codinggirl 技术杂烩 94 2004-08-03 10:58 AM
C++程序设计之四书五经(荣耀)-----------转贴 wy 技术杂烩 4 2004-07-31 03:02 PM
ACE的源码划分和library subsetting --ZT codinggirl C/CPP/TMP/GP 1 2004-07-08 07:56 PM
[ACE]ACE压缩文档格式 polyrandom 技术杂烩 0 2004-07-01 09:46 PM


所有时间均为格林尼治时间 +9。现在的时间是 06:47 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0