微信公众号侵权投诉文章第二次侵权会被封多久

ldd 查看程序/动态库 的依赖 - DoubleLi - 博客园
今天在帮同事查看一个问题时, 需要用到ldd, 于是就顺便看了一下ldd的实现. 好在ldd本身只是一个脚本, 而不是executable, 可以直接查看实现的代码.根据注释:&21 # This is the `ldd' command, which lists what shared libraries are&22 # used by given dynamically-linked executables.& It works by invoking the&23 # run-time dynamic linker as a command and setting the environment&24 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.LDD只是设置了LD_TRACE_LOADED_OBJECTS后, 再运行程序或调用/lib/ld-linux.so.2(或/lib64/ld-linux-x86-64.so.2或其他, 取决于系统的architecture等等)来处理动态库, 再将输出分析从而得到整个依赖关系.于是对于正常的exectuable(以a.out为例)而言, 另一种获得依赖关系列表的方式为:export LD_TRACE_LOADED_OBJECTS=1./a.out输出的结果为:
linux-gate.so.1 =& (0xb78b5000)
librt.so.1 =& /lib/tls/i686/cmov/librt.so.1 (0xb78a4000)
libselinux.so.1 =& /lib/libselinux.so.1 (0xb7889000)
libacl.so.1 =& /lib/libacl.so.1 (0xb7880000)
libc.so.6 =& /lib/tls/i686/cmov/libc.so.6 (0xb7726000)
libpthread.so.0 =& /lib/tls/i686/cmov/libpthread.so.0 (0xb770d000)
/lib/ld-linux.so.2 (0xb78b6000)
libdl.so.2 =& /lib/tls/i686/cmov/libdl.so.2 (0xb7709000)
libattr.so.1 =& /lib/libattr.so.1 (0xb7703000)
而对于.so(假设有个liba.so)而言, 另一种获得依赖关系的方式为:export LD_TRACE_LOADED_OBJECTS=1/lib/ld-linux.so.2 ./liba.so输出结果为:
linux-gate.so.1 =& (0xb777e000)
libdb-4.8.so =& /home/db/opt/dbxml/install/lib/libdb-4.8.so (0xb7360000)
libxqilla.so.5 =& /home/db/opt/dbxml/install/lib/libxqilla.so.5 (0xb6f10000)
libxerces-c-3.0.so =& /home/db/opt/dbxml/install/lib/libxerces-c-3.0.so (0xb6b6c000)
libz.so.1 =& /lib/libz.so.1 (0xb6b51000)
libstdc++.so.6 =& /usr/lib/libstdc++.so.6 (0xb6a5b000)
libm.so.6 =& /lib/tls/i686/cmov/libm.so.6 (0xb6a35000)
libc.so.6 =& /lib/tls/i686/cmov/libc.so.6 (0xb68db000)
libgcc_s.so.1 =& /lib/libgcc_s.so.1 (0xb68bb000)
libpthread.so.0 =& /lib/tls/i686/cmov/libpthread.so.0 (0xb68a2000)
libnsl.so.1 =& /lib/tls/i686/cmov/libnsl.so.1 (0xb688b000)
/lib/ld-linux.so.2 (0xb777f000)
运行中发现貌似/lib/ld-linux.so.2后面的参数是需要带绝对路径或者相对路径的(当前目录则需要用./作为前缀), 目前还不知道ld-linux.so.2是如何确定参数路径的. 当然, 实际上executable也可以用/lib/ld-linux.so.2来获得依赖列表.实际上/lib/ld-linux.so.2是用来运行程序的. 当执行一个动态链接的程序时, 该工具被自动调用用来获得并解析程序的依赖关系而后执行程序本身. 关于/lib/ld-linux.so.2命令的详情, 参见 http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html查看可执行程序的依赖库及相关信息 - 蓝星星 - ITeye技术网站
博客分类:
主要针对ELF(可执行文件和可链接文件),有点反汇编的味道
VC6里有depend和dumpbin,Linux下是ldd和objdump,可查询依赖库
objdump可查到所使用cross-compile的版本,用法为objdump -s --section=.comment $prog
嵌入式版本有arm-linux-readelf:
(1)在host (x86) 机器上, 使用 arm-linux-readelf -d $target_prog 或 arm-linux-readelf -a | grep "Shared" $target_prog (2)在target(arm)机器上,使用 /lib/ld.so.2 --list $prog
此外,file命令可以查看文件基本信息
ar 让你能查看函数库里的详细情况和用多个对象文件生成一个库文件。
经常用法:
1. ar -t libname.a //显示所有对象文件(.o文件)的列表.例: # ar t libtest.a
libtest1.o
libtest2.o
2. ar -rv libname.a
objfile1.o objfile2.o ... objfilen.o
//把objfile1.o--objfilen.o打包成一个库文件
nm --列出目标文件(.o)的符号清单
nm -s filename.a/filename.o/a.out
里边所有的符号列表一清二楚。例:# nm -s a.out A __bss_start t call_gmon_start
其实ar和nm的功能基本都可以用objdump配合适当的参数实现
研究这个问题是因为之前交叉编译了QT4.7的库,但忘了使用的是不是EABI的交叉编译工具,通过arm-linux-readelf -h读取头文件,显示OS/ABI-ARM,Flags-GNU EABI,再由file显示gcc3.4.1,确定不是eabi版的
(以下转)我开始的时候并不知道怎么指定gcc的EABI,还以为4.1以上的gcc自动都是EABI,结果就是生成的内核能跑,而init进程(根文件系统的第一个进程)却运行不了。而最让我啼笑皆非的是 readelf,这绝对对我是误导的,例如:一个ABI的文件#readelf -h aaELF Header:
7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
2's complement, little endian
1 (current)
ABI Version:
EXEC (Executable file)
Entry point address:
Start of program headers:
52 (bytes into file)
Start of section headers:
2361284 (bytes into file)
0x2, has entry point, GNU EABI
Size of this header:
52 (bytes)
Size of program headers:
32 (bytes)
Number of program headers:
Size of section headers:
40 (bytes)
Number of section headers:
Section header string table index: 32看见Flags那行了吗?清清楚楚写的是GNU EABI,其实它是ABI(想起来台词:它看起来是一个电吹风,其实还是刮胡刀)真正的EABI是这样的#readelf -h a.outELF Header:
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
2's complement, little endian
1 (current)
UNIX - System V
ABI Version:
EXEC (Executable file)
Entry point address:
Start of program headers:
52 (bytes into file)
Start of section headers:
2460164 (bytes into file)
0x4000002, has entry point, Version4 EABI
Size of this header:
52 (bytes)
Size of program headers:
32 (bytes)
Number of program headers:
Size of section headers:
40 (bytes)
Number of section headers:
Section header string table index: 33
lanxinyuchs
浏览: 145014 次
来自: 成都
都不如protobuf配合zmq啊}

我要回帖

更多关于 微信公众号昵称侵权 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信