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

时间:2018-02-22 04:52:49

标签: gcc shared-libraries object-files

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

表示如何注意用于从.so文件构建.so文件的目标文件是什么(如果我只有.so文件)

1 个答案:

答案 0 :(得分:3)

只有共享库,您才能知道,目标文件是什么 编入其中。如果你很幸运,你可以做出合理的猜测。

共享库由链接器从目标文件和 可能是其他共享库,但它不包含目标文件 或者从中创建它的共享库。另一方面,静态库 由归档器ar生成, 包含对象 files:它只是目标文件的ar存档。

如果没有删除共享库的调试信息,那么 出于调试目的,其符号表将包含文件的名称 从中编译的目标文件是在共享库中链接的 - 至少是那些使用调试信息编译的源文件。 从这些源文件的名称中,您可以推断出目标文件的名称 有合理的信心,但不确定。

例如,我们在这里从源文件foo.cbar.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

然后:

$ readelf -s libfoobar.so | grep FILE
26: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
35: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS foo.c
37: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS bar.c
39: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
42: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 

表示三个源文件已向其提供调试信息 库,我们推断它们编译的目标文件 可能是:

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
$

不再有FILE个符号。