如何获取Linux-gate.so.1动态库

前面“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.   
  6. VDSO_BLOCK=`echo |awk '{print substr("'${VDSO_ADDR}'",1,5)}'`  
  7. ((SKIP_BLOCKS=16#$VDSO_BLOCK))  
  8. echo "We have $SKIP_BLOCKS blocks before VDSO library"  
  9.   
  10. echo "Ready to generate $VDSO_FILE_NAME from block $SKIP_BLOCKS"  
  11. dd if=/proc/self/mem of=$VDSO_FILE_NAME bs=4096 skip=$SKIP_BLOCKS count=1  
  12.   
  13. 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.   
  11. ~> file -b linux-gate.dso  
  12. ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped  
  13. ~> objdump -T linux-gate.dso  
  14.   
  15.   
  16. linux-gate.dso:     文件格式 elf32-i386  
  17.   
  18.   
  19. DYNAMIC SYMBOL TABLE:  
  20. ffffe400 l    d  .text  00000000              .text  
  21. ffffe478 l    d  .eh_frame_hdr  00000000              .eh_frame_hdr  
  22. ffffe49c l    d  .eh_frame      00000000              .eh_frame  
  23. ffffe620 l    d  .useless       00000000              .useless  
  24. ffffe400 g    DF .text  00000014  LINUX_2.5   __kernel_vsyscall  
  25. 00000000 g    DO *ABS*  00000000  LINUX_2.5   LINUX_2.5  
  26. ffffe440 g    DF .text  00000007  LINUX_2.5   __kernel_rt_sigreturn  
  27. 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]

时间: 2025-01-29 13:41:42

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

Linux/Unix 下调试动态库(.so文件)

问题描述 Linux/Unix 下调试动态库(.so文件) 需要调试一个C语言编写的动态库,这个动态库也是我自己写的编译的时候加了-g参数. 但是这个动态库是给oracle数据库调用的,也就是在存储过程里面调用这个动态库.由于这个动态库是新写的,经常有问题需要用gdb跟踪代码调试.我要怎么做才能调试这个动态库呢??? 目前想到的一个办法就是再写一个C程序调用这个动态库然后gdb调试.但是这个动态库提供给数据库的接口很多全部写出来比较费时间.希望找个方便点的方法,类似于gdb直接调试运行中的程序.

Linux下生成使用动态库和静态库

Linux中有两类函数库,动态库和静态库 静态库: 这类库一般都是以.a为后缀名的文件,利用静态库函数编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中. 编译后的执行程序就不需要外部的函数库支持,但也有其缺点,就是一旦静态函数库改变了,那么程序就必须重新编译. 动态库: 这类库的一般都是以.so为后缀名的,相对于静态库函数库来说,动态函数库在编译的时候并没有被编译进目标代码中.当程序执行到相关函数时才调用该函数库里的相应函数,因此动态库函数库所产生的可执行文件比较小,由于函数库

linux jna调用so动态库

文中提到:为什么命名为libtest.so而不是test.so呢?因为jna在找so文件的时候,要匹配前缀为lib的so文件 http://zhenaihua0213.blog.163.com/blog/static/50887766201129104611955/ 在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1.写一个简单test.c文件: #include<stdio.h> int add(int a,int b); int add(int a,int b

分析Windows和Linux动态库_unix linux

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植.本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验. 1.引言 动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用

linux下动态库(*.so)的路径问题

本文为原创,如需转载,请注明作者和出处,谢谢!     最近在使用wxWidgets,这是一个跨平台的C++库,在linux下编译成动态库(*.so),如果将编译后的可执行文件发布到其他机器的linux系统中,需要带上.so文件,这就需要设置一下这些动态库的路径,一般可以使用环境变量LD_LIBRARY_PATH来设置,可以在终端中直接输出如下的命令: export LD_LIBRARY_PATH=/library/wxwidgets 其中/library/wxwidgets是.so文件存放的路

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情.       在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应

linux-Linux下, 加载动态库报宽字符错误.

问题描述 Linux下, 加载动态库报宽字符错误. 请教: 如题: 程序启动时加载某动态库(.so)时,提示加载失败 具体提示为 load lib???????.so fail, reason:Invalid or incomplete multibyte or wide character. 解决方案 可能是字符集不同的原因

linux-小白求助!动态库基址加载问题

问题描述 小白求助!动态库基址加载问题 想请问一下,如果不使用aslr技术,linux中加载动态库时,是否每次的基址都是不变的?那么栈的基址会变吗?谢谢! 解决方案 如果没有进行动态地址切换,那么基地址不会变,栈的基址不是固定的,它是挨着堆空间,所以基址不是固定的. 解决方案二: 应该是会变的,因为如果一个库要载入的地址已经被其他载入的库占用了,就只能改变载入的基地址,,

linux下cp,mv进行动态库覆盖问题分析

问题的起因在来源于周会上老板提出的一个问题,cp新的so文件替换老的so,会导致程序core掉.这个问题引起了大家的热烈讨论,其中提及了的名词有inode,dentry,buserror等,比较混乱,由于功力浅薄,当时也没有十分清楚引起core掉的原因.于是乎趁着10.1的休息时间,闲里偷忙,理一理当时的问题,有不对之处,还请大家多多指出. 文章主要分为下面几个部分 part1.inode,dentry名词介绍 part2.cp,mv操作对inode的影响 part3.cp,mv覆盖动态库的区别

Linux静态库和动态库的编写和使用

Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.   1  静态库和动态库的区别 1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a (2)利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,它的优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.这给它带来的缺点为如果静态函数库改变了,那么你的程序必须重新编译. 1.2. 动态