前面“Linux应用程序Helloworld入门”已经提到在Linux下每个可执行文件都依赖于几个最为基本的动态库,其中一个就是linux-gate.so.1。

从上面ldd给出的结果可以看出,这个linux-gate.so.1动态库有一些异样,libc.so.6的实际动态库路径在/lib/tls/i686/cmov/libc.so.6,而ld-linux.so.2是在/lib/ld-linux.so.2。那么不禁要问一个问题linux-gate.so.1这个动态库的路径是什么,是文件系统中那个文件呢?其实这个文件是内核映射上去的,并非存在实际的动态库文件,对于这个具体问题我们后续再做详细分析,这里仅仅做如何获取linux-gate.so.1动态库的方法。

通常情况下,比如在SUSE10, suse11系统上,linux-gate.so.1被映射到ffffe000-fffff000这个高端内存段里面。此时将这段内存导出到文件比较简单,可以使用下面脚本,帮助各位导出:

 
  1. VDSO_FILE_NAME=linux-gate.dso
  2. cat /proc/self/maps|grep "vdso"
  3. VDSO_ADDR=`cat /proc/self/maps|grep "vdso" |awk -F '-' '{print $1 }'`
  4. echo "Current VDSO address is 0x$VDSO_ADDR"
  5. VDSO_BLOCK=`echo |awk '{print substr("'${VDSO_ADDR}'",1,5)}'`
  6. ((SKIP_BLOCKS=16#$VDSO_BLOCK))
  7. echo "We have $SKIP_BLOCKS blocks before VDSO library"
  8. echo "Ready to generate $VDSO_FILE_NAME from block $SKIP_BLOCKS"
  9. dd if=/proc/self/mem of=$VDSO_FILE_NAME bs=4096 skip=$SKIP_BLOCKS count=1
  10. echo "Generate $VDSO_FILE_NAME Done"

在suse系统上执行的结果:

 
  1. ~> ./cat_linux_gate_so.sh
  2. ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]
  3. Current VDSO address is 0xffffe000
  4. We have 1048574 blocks before VDSO library
  5. Ready to generate linux-gate.dso from block 1048574
  6. 1+0 records in
  7. 1+0 records out
  8. 4096 bytes (4.1 kB) copied, 4.2e-05 seconds, 97.5 MB/s
  9. Generate linux-gate.dso Done
  10. ~> file -b linux-gate.dso
  11. ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped
  12. ~> objdump -T linux-gate.dso
  13. linux-gate.dso:     文件格式 elf32-i386
  14. DYNAMIC SYMBOL TABLE:
  15. ffffe400 l    d  .text  00000000              .text
  16. ffffe478 l    d  .eh_frame_hdr  00000000              .eh_frame_hdr
  17. ffffe49c l    d  .eh_frame      00000000              .eh_frame
  18. ffffe620 l    d  .useless       00000000              .useless
  19. ffffe400 g    DF .text  00000014  LINUX_2.5   __kernel_vsyscall
  20. 00000000 g    DO *ABS*  00000000  LINUX_2.5   LINUX_2.5
  21. ffffe440 g    DF .text  00000007  LINUX_2.5   __kernel_rt_sigreturn
  22. ffffe420 g    DF .text  00000008  LINUX_2.5   __kernel_sigreturn

Ubuntu 上情况比较复杂,在此也耽误了不少时间,因为ubuntu映射到的内存地址是不固定的,每个进程映射的位置都是不同的。

多次执行:

 cat /proc/self/maps|grep "vdso"  

b7f47000-b7f48000 r-xp b7f47000 00:00 0          [vdso]

b7f5f000-b7f60000 r-xp b7f5f000 00:00 0          [vdso]

b7f54000-b7f55000 r-xp b7f54000 00:00 0          [vdso]

如何获取Linux-gate.so.1动态库的更多相关文章

  1. Linux程序编译链接动态库版本号的问题

    不同版本号的动态库可能会不兼容,假设程序在编译时指定动态库是某个低版本号.执行是用的一个高版本号,可能会导致无法执行. Linux上对动态库的命名採用libxxx.so.a.b.c的格式.当中a代表大 ...

  2. ffmpeg学习笔记-Linux下编译Android动态库

    Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...

  3. linux 下 奇怪的 动态库 依赖问题

    转:http://fanwei51880.blog.163.com/blog/static/3240674020111145285375/ 总结如下:1)当你在编译生成静态库的时候, 只需要相应的依赖 ...

  4. Linux 指定运行时动态库路径【转】

    转自:http://www.cnblogs.com/cute/archive/2011/02/24/1963957.html 众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/l ...

  5. linux & windows下的动态库制作

     动态链接库不是linux独有的特性,在windows下面也存在这样的特性.一般来说,windows下面的动态连接库是以*.dll作为结尾的,而linux下面的动态连接库是以*.so结尾的.和静态链接 ...

  6. Linux找不到动态库

    首先系统上得有,只是路径问题 可使用ldd查看可执行程序的依赖库 以下都需要超级权限: find / -name libnet.so.9 // 可能在/usr/lib或/usr/local/lib中 ...

  7. 【转】Linux的nm查看动态库和静态库的符号

    转自https://blog.csdn.net/qq_16683355/article/details/52297884 功能 列出.o..a..so中的符号信息,包括符号的值,符号类型及符号名称等. ...

  8. linux c++ 加载动态库常用的三种方法

    链接库时的搜索路径顺序:LD_LIBRARY_PATH --> /etc/ld.so.conf --> /lib,/usr/lib 方法1. vi .bash_profile    设置环 ...

  9. Linux动态库的编译与使用 转载

    http://hi.baidu.com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html Linux下的动态库以.so为后缀,我也是初次在Linux下 ...

  10. 【转】分析Linux和windows动态库

    原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...

随机推荐

  1. Centos更改镜像源

    阿里云Linux安装镜像源: 1.备份原镜像文件以便于恢复. [root@localhost ~]#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repo ...

  2. 常用的几个PHP加密函数

    1.前言 PHP加密方式分为单项散列加密,对称加密,非对称加密这几类. 像常用的MD5.hash.crypt.sha1这种就是单项散列加密,单项散列加密是不可逆的. 像URL编码.base64编码这种 ...

  3. H5 Canvas图像模糊解决办法

    1.最近在用h5的canvas画动画,发现图像特别模糊.后来终于找到罪魁祸首是<meta name="viewport" content="width=device ...

  4. Ubuntu14.04server + LNMP + Zabbix3.4安装教程

    此教程使用的编辑器是vim LNMP安装很简单,跟着步骤走没有问题,就不粘图片了. 安装MYSQL (1)开始安装:apt-get install mysql-server libmysqld-dev ...

  5. dubbo调用负载均衡

    dubbo负载均衡的地址:http://dubbo.io/books/dubbo-user-book/demos/loadbalance.html 随机策略: public class RandomL ...

  6. WebStorm11

    1.下载补丁 1.下载地址:http://pan.baidu.com/s/1gdnrdWv 2.拷贝下载的文件 JetbrainsCrack.jar 到 /bin目录下(是指你的软件安装根目录) 2. ...

  7. CTP期货期权交易开发

    CTP交易部分接口说明 综合交易平台(Comprehensive Transaction Platform,CTP)是专门为期货公司开发的一套期货经纪业务管理系统,由交易.风险控制和结算三大系统组成. ...

  8. Windows上MongoDB的安装

    下载 下载MongoDB,自然是在他的官网下载相应系统的版本了,我下载的是Windows的安装包. 安装 傻瓜式安装,不多说.(默认安装在C盘的.) 启动 mongodb的数据存在一个叫data 文件 ...

  9. 01 Mybatis 的配置和使用

    一.Mybatis 是什么 MyBatis 是一个支持普通SQL查询.存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装.MyB ...

  10. LeetCode - 728. Self Dividing Numbers

    A self-dividing number is a number that is divisible by every digit it contains. For example, 128 is ...