Gcc 如何查看.so文件的对象文件内容

Gcc 如何查看.so文件的对象文件内容,gcc,shared-libraries,object-files,Gcc,Shared Libraries,Object Files,如何查看.o文件构成的.so文件 表示如何注意从.so文件(如果我只有.so文件)构建.so文件时使用的对象文件是什么(如果我只有.so文件)如果只有一个共享库,您无法知道对象文件是什么 编译成它。如果你幸运的话,你可能会做出合理的猜测 链接器通过对象文件和文件创建共享库 可能是其他共享库,但它不包含对象文件 或者是制作它的共享库。另一方面,静态库 由归档员制作,不包含对象 文件:它只是对象文件的ar存档 如果共享库中没有删除调试信息,则 出于调试目的,其符号表将包含源文件的名称 从中编译在共享

如何查看.o文件构成的.so文件

表示如何注意从.so文件(如果我只有.so文件)构建.so文件时使用的对象文件是什么(如果我只有.so文件)

如果只有一个共享库,您无法知道对象文件是什么 编译成它。如果你幸运的话,你可能会做出合理的猜测

链接器通过对象文件和文件创建共享库 可能是其他共享库,但它不包含对象文件 或者是制作它的共享库。另一方面,静态库 由归档员制作,不包含对象 文件:它只是对象文件的
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
$