网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C/C++指针应用.
.C++初学者应该关心的优秀图书一览.
.在CB5中使用ADO数据库编程.
.C程序开发经典实例之3.
.C++对象布局及多态实现之动态和强.
.深入解析C++中的三个修饰符.
.Visual FoxPro 9 集成开发环境新.
.VC++开发BHO插件—定制浏览器.
.也谈TTreeView、TListView用法.
.奇技淫巧C++之懒惰计算.
.使用CommaText.
.C++ Builder 初学问与答 (十一).
.Perform()与SendMessage()的不同.
.C语言实现MATLAB 6.5中M文件的方.
.C++箴言:用成员函数模板接受兼容.
.在CB中使用ACCESS数据库.
.C语言中的位运算.
.C语言之C语言的底层操作.
.基于VC++的OpenGL编程讲座之概述.
.VC的若干实用小技巧(三).

GNUC库----调试系统问题并进行修订

发表日期:2008-3-8



  一种调试 glibc 函数的好方法是用您自己的版本覆盖所关注的函数。在没有 root 许可权和不必重新编译 libc 源代码的情况下就可以完成这个任务。想象一下编写您自己的 open() 版本该有多激动啊!
  
  假如您没有应用程序的源代码并且由于 C 的 GNU 库(glibc)函数正将某些错误信息返回给该应用程序而使它失败,那么您该怎么办?因为 glibc 是开放源码,所以您当然可以获得其源代码、对它进行更改、重新构建和安装。然而,这不适合那些胆怯的人,因为虽然 API 有很好的文档说明,但 GNU C 库的内部组织却没有。查找正确的函数原型只是众多挑战中的第一个。它还是一个很大的包,所以第一次编译时,它将花一些时间(glibc 2.2.2 有 8552 个文件和 1775440 行代码,包括注释)。
  
  更好的方法
  比重新构建 glibc 更好的方法是选择性地覆盖一个函数。许多现代的 Unix 都支持预装入用户定义库这一概念。这些库可以是完整的替代(即,glibc 的专用版本)也可以是子集 ― 甚至是一个函数。首先,通过设置 LD_LIBRARY_PATH 来包含库的专用版本,您可以使用 glibc 的专用版本。可通过使用 LD_PRELOAD 环境值来使用您编写的库例程的子集。LD_LIBRARY_PATH 和 LD_PRELOAD 都是由动态 ELF 链接器/装入器控制的。它使用第一个匹配来满足任何符号名。通过预装入您自己的库或函数版本,您“短路”了正常路径,这样就答应您覆盖它。
  
  这里是一个示例 makefile,它覆盖 glibc 函数 setresgid():
  
  覆盖 setresgid() 的 Makefile
   #
   # Makefile
   #
  
   all: libs setresgid-tester
  
   #
   # Make a shared Library
   #
   libs: libfuncs.c
       gcc -shared -Wl,-soname,libfuncs.so.1 -o libfuncs.so.1.0 libfuncs.c
       ln -s libfuncs.so.1.0 libfuncs.so.1
       ln -s libfuncs.so.1 libfuncs.so
  
   #
   # Here is a program that calls setresgid() for testing
   #
   setresgid-tester: setresgid-tester.c
       gcc -o setresgid-tester setresgid-tester.c
  文件 libfuncs.c 包含我的 setresgid() 专用版本。实现它以支持与原始 setresgid() 相同的参数数目时要小心,并在其它方面完成与原始 setresgid() 相同的操作,尽管我的版本欺骗该应用程序并始终返回 0。
  
  关注的第二个文件是 setresgid-tester.c。它通过调用 setresgid() 试验新函数。
  
  这是动态库的源代码:
  
  替换库
   /*
   Put all the functions you want to override here
   */
   #include
   #include
   #include
  
   int errno;
  
   int
   setresgid(rgid, egid, sgid)
       gid_t rgid,egid,sgid;
   {
    errno=1;
    printf("It me the shim, Hi there!\n");
    return(0);
  
   }
  
  您还需要一个简单方法来测试您的 setresgid() 专用版本。可以使用 strace 或 ltrace 来监视进程运行。这是普通测试示例的源代码:
  
  普通测试示例
   /*
    setresgid() system/library call tester
   */
   #include
   #include
   main(){
    setresgid(0,0,0);
   }
  
  现在,编译该库,设置 LD_PRELOAD shell 变量,然后运行测试应用程序。您可能还需要设置 LD_LIBRARY_PATH。
  
  运行测试应用程序
  eXPort LD_PRELOAD=libfuncs.so
  export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
  ./setresgid-tester
  It's me the shim, Hi there!
  
  还可以通过使用 ldd 列出动态链接库来确认是否正在使用专用库:
  
  确认专用库的使用
  [jay@prion ld_preload]$ ldd setresgid-tester
      libfuncs.so => libfuncs.so (0x40018000)
      libc.so.6 => /lib/libc.so.6 (0x40022000)
      /lib/ld-Linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  结束语
  编写 GNU C 库函数的专用版本是调试系统问题或进行快速修正的好方法。使用 LD_PRELOAD shell 变量,可以选择性地用您自己的专用版本来覆盖系统 C 库函数。这种技术可用于 Linux 和 Solaris 环境。

上一篇:三维视图绘制与消隐技术 人气:400
下一篇:绝对能够测试你的C语言功力的几个问题 人气:471
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐