注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
D2OL 让网络保卫大家的健康
及时防范 看PDF、Flash中病毒解决
三招两式帮你解决WLAN的安全问题
Microsoft AntiSpyware微软出品的
SOHO网络解决方案
宽带来临 封杀FSO躲避FSO木马的侵
Htran把内网肉鸡做成SOCKS5代理
玩FLASH也要注意安全 Flash Play
LAMP 架构服务器性能优化建议
DNS 记录项目 (Resource Records
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> C >> 文章正文
Solaris下如何使用LD_PRELOAD环境变量
作者:佚名  来源:不详  点击:  更新:2006-12-19
简介:
by scz (小四)

下面即将演示如何利用LD_PRELOAD环境变量影响标准I/O库函数printf(3S)。环境变 
量LD_PRELOAD的值是whitespace-separated的共享库列表,运行时链接器负责解释它。 
由LD_PRELOAD指定的共享库优于其他共享库加载。 

-------------------------------------------------------------------------- 
/* main.c */ 
#include  
#include  

int main ( int argc, char * argv[] ) 

  char s[] = "Hello World\n"; 

  printf( s ); 
  return( EXIT_SUCCESS ); 

-------------------------------------------------------------------------- 

-------------------------------------------------------------------------- 
/* mylib.c */ 
#include  
#include  

int printf ( char * s ) 

  char *t = s; 

  while ( *s ) 
  { 
    *s = toupper( *s ), s++; 
  } 
  return( ( int )write( 0, t, strlen( t ) ) ); 

-------------------------------------------------------------------------- 

-------------------------------------------------------------------------- 
# Makefile 

CC="/opt/SUNWspro/SC5.0/bin/cc" 

all: a.out 

mylib.so: mylib.c 
 ${CC} -g -G -o mylib.so mylib.c 

a.out: main.c mylib.so 
 ${CC} -g main.c 

clean: 
 rm -rf mylib.so mylib.o a.out *~ 
-------------------------------------------------------------------------- 

[scz@ /export/home/scz/src]> sotruss ./a.out 
a.out      ->    libc.so.1:*atexit(0xff3b9c6c, 0x20800, 0x0) 
a.out      ->    libc.so.1:*atexit(0x109f0, 0xff3b9c6c, 0xff235e68) 
a.out      ->    libc.so.1:*printf(0xffbefa47, 0xff239c1c, 0xff235e60) 
Hello World 
a.out      ->    libc.so.1:*exit(0x0, 0xffbefabc, 0xffbefac4) 
[scz@ /export/home/scz/src]> 

注意到来自动态链接库"libc.so.1"的库函数printf()在"a.out"中被调用。现在,如 
果你想使用来自"mylib.so"的printf()函数,利用LD_PRELOAD环境变量通知运行时链 
接器优先使用"mylib.so"解析未知符号。 

[scz@ /export/home/scz/src]> LD_PRELOAD=./mylib.so ./a.out 
HELLO WORLD 
[scz@ /export/home/scz/src]> 

为了解释更清楚些,再次使用sotruss(1)命令 

[scz@ /export/home/scz/src]> LD_PRELOAD=./mylib.so sotruss ./a.out 
a.out      ->    libc.so.1:*atexit(0xff3b9c6c, 0x20800, 0x0) 
a.out      ->    libc.so.1:*atexit(0x109f0, 0xff3b9c6c, 0xff235e68) 
a.out      ->    mylib.so:*printf(0xffbefa27, 0xff239c1c, 0xff235e60) 
HELLO WORLD 
a.out      ->    libc.so.1:*exit(0x0, 0xffbefa9c, 0xffbefaa4) 
[scz@ /export/home/scz/src]> 

如你所见,运行时链接器现在使用了来自动态链接库"mylib.so"的printf()函数。






  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务