首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

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

http://www.oklinux.cn  2007-02-09  来源: oklinux收集整理   会员收藏  游客收藏  【 】 


  一种调试 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 环境。




上一篇:关于C++代码优化的方法总结(一)   下一篇:C++常用字符串处理函数及使用示例


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·C++常用字符串处理函数及使用示例
·关于C++代码优化的方法总结(一)
·新手学习之浅析一下c/c++中的指针
·用C与脚本的混合编程来处理配置文件
·使用profile来得到程序运行信息
·C++中关于指针入门的最好的文章
·解析Linux下的并口编程(英文版)
·Linux下C语言编程--时间概念
·SourceInsight3.0:Linux源代码阅读
·在CMP实体BEAN中使用BLOB数据类型
·linux下命令行下编译c程序
·SMS中用Unicode编码发送中文的办法
·Linux下C++异常处理技巧-实例讲解
·在C/C++中如何构造通用的对象链表
·轻松就能让Linux下的C编程从头来
·GCC内嵌汇编之语法详解
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
·轻轻松松C to C (二)
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·程序员眼中的qmail(qmail源代码分析)
·Awk 基础入门:Awk 实例编程
·autoconf 和automake生成Makefile文件
·Linux下的多进程编程
·使用 GDB 调试多进程程序
·入门文章:教你学会编写Linux设备驱动
·C++自动化(模板元)编程基础与应用
·Qt 不规则窗体的实现
·嵌入式程序员应知道的几个基本问题
·Linux操作系统中GCC的应用介绍
·C语言中的指针和内存泄漏
·用GNU profiler提高代码运行速度
·vi 中的正则表达式 (Regular Expressio
·Linux 套接字编程中的 5 个隐患
网摘收藏: