你不能know,给定一个共享库,目标文件是什么
编译到其中。如果你幸运的话,你也许能够做出合理的猜测。
共享库是由链接器从目标文件创建的
可能还有其他共享库,但它没有contain目标文件
或从中创建它的共享库。 Astatic另一方面,图书馆
由存档者制作ar https://linux.die.net/man/1/ar, does包含对象
文件:这只是一个ar
目标文件的归档。
如果共享库尚未去除调试信息,则
出于调试目的,其符号表将包含source文件
从中编译链接到共享库中的目标文件 - 至少是那些使用调试信息编译的源文件。
从这些源文件的名称,您可以推断出目标文件的名称
有合理的信心,但没有确定性。
例如,这里我们从源文件制作一个共享库foo.c
and 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
Then:
$ 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
不是源文件之一we编译。它
恰好包含来自 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
$
No more FILE
符号。