Gcc 如何查看.so文件的对象文件内容
如何查看.o文件构成的.so文件 表示如何注意从.so文件(如果我只有.so文件)构建.so文件时使用的对象文件是什么(如果我只有.so文件)如果只有一个共享库,您无法知道对象文件是什么 编译成它。如果你幸运的话,你可能会做出合理的猜测 链接器通过对象文件和文件创建共享库 可能是其他共享库,但它不包含对象文件 或者是制作它的共享库。另一方面,静态库 由归档员制作,不包含对象 文件:它只是对象文件的Gcc 如何查看.so文件的对象文件内容,gcc,shared-libraries,object-files,Gcc,Shared Libraries,Object Files,如何查看.o文件构成的.so文件 表示如何注意从.so文件(如果我只有.so文件)构建.so文件时使用的对象文件是什么(如果我只有.so文件)如果只有一个共享库,您无法知道对象文件是什么 编译成它。如果你幸运的话,你可能会做出合理的猜测 链接器通过对象文件和文件创建共享库 可能是其他共享库,但它不包含对象文件 或者是制作它的共享库。另一方面,静态库 由归档员制作,不包含对象 文件:它只是对象文件的ar存档 如果共享库中没有删除调试信息,则 出于调试目的,其符号表将包含源文件的名称 从中编译在共享
ar
存档
如果共享库中没有删除调试信息,则
出于调试目的,其符号表将包含源文件的名称
从中编译在共享库中链接的目标文件-至少是使用调试信息编译的源文件。
从这些源文件的名称可以推断出目标文件的名称
有合理的信心,但不能确定
例如,这里我们从源文件foo.c
和bar.c
创建一个共享库
将源文件编译为目标文件:
$ gcc -Wall -fPIC -c -o foo.o foo.c
$ gcc -Wall -fPIC -c -o bar.o bar.c
链接对象文件以创建共享库:
$ gcc -shared -o libfoobar.so foo.o bar.o
然后:
指示有三个源文件已将调试信息提供给
库,我们可以推断它们编译到的对象文件
可能是:
crtstuff.o
foo.o
bar.o
请注意,crtstuff.c
不是我们编译的源文件之一。信息技术
碰巧包含来自C运行时库的程序初始化和终结代码,该库已进入
我们的库来自默认链接的C运行时对象文件
任何文件的这种推断都可能是错误的,因为:
$ gcc -Wall -fPIC -c -o abc.o foo.c
$ gcc -Wall -fPIC -c -o xyz.o bar.c
$ gcc -shared -o libfoobar.so abc.o xyz.o
也是编译和链接库的一种完全可能的方式
如果已从库中删除调试信息:
$ strip -g libfoobar.so
那么我们就不走运了:
$ readelf -s libfoobar.so | grep FILE
$
不再有文件
符号
$ readelf -s libfoobar.so | grep FILE
$