如何查看.o文件构成.so文件?
表示如何注意用于从.so文件构建.so文件的目标文件是什么(如果我只有.so文件)
答案 0 :(得分:3)
只有共享库,您才能知道,目标文件是什么 编入其中。如果你很幸运,你可以做出合理的猜测。
共享库由链接器从目标文件和
可能是其他共享库,但它不包含目标文件
或者从中创建它的共享库。另一方面,静态库
由归档器ar
生成, 包含对象
files:它只是目标文件的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
然后:
$ 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
个符号。