您想知道为什么程序的链接要费心去解析源自
与其链接的共享库,因为:
当共享对象本身链接时,我的共享对象的引用不是已经检查了吗?
不,它们不是,除非您在链接共享库时明确坚持,
这里我要建一个共享库libfoo.so:
foo.c
extern void bar();
void foo(void)
{
bar();
}
例行编译链接:
$ gcc -fPIC -c foo.c
$ gcc -shared -o libfoo.so foo.o
没问题,bar 未定义:
$ nm --undefined-only libfoo.so | grep bar
U bar
我需要坚持让链接器反对:
$ gcc --shared -o libfoo.so foo.o -Wl,--no-undefined
foo.o: In function `foo':
foo.c:(.text+0xa): undefined reference to `bar'
当然:
main.c
extern void foo(void);
int main(void)
{
foo();
return 0;
}
它不会让我将libfoo 链接到一个程序:
$ gcc -c main.c
$ gcc -o prog main.o -L. -lfoo
./libfoo.so: undefined reference to `bar'
除非我也在同一个链接中解析bar:
bar.c
#include <stdio.h>
void bar(void)
{
puts("Hello world!");
}
也许通过从另一个共享库获取它:
gcc -fPIC -c bar.c
$ gcc -shared -o libbar.so bar.o
$ gcc -o prog main.o -L. -lfoo -lbar
然后一切都很好。
$ export LD_LIBRARY_PATH=.; ./prog
Hello world!
它是共享库的本质,默认情况下它没有
在链接时解析其所有符号。这样一来,程序 -
通常确实需要它的所有符号解析一个链接时间 - 可以获得它的所有符号
通过与多个库链接来解决。