2. 要注意ld的一个特性:当ld查找一个symbol的时候,ld只会往后查找,不会往前查找。比如程序以来两个库A和B,而A库又调用了B库中的函数,那 么编译的时候,在命令行上,A库文件要出现在B库文件的前面。当ld发现A库中某个函数找不到时,他就会往后查找,于是在B库中找到了这个函数,OK。如 果AB两个库互相依赖,那么一般命令行中要写成A B A或B A B这样的格式。这就是为什么也会经常看到命令行中有重复出现相同库的原因。比如A B A这种情况,当ld发现A中有个函数undefined时,往后查找,在B中找到了,OK;继续在B中发现一个函数undefined,也往后找,在A中 找到了该函数,然后也OK了。
3. 当不知道哪个函数在哪个.a中的时候,用objdump -t <filepath>|grep xxx来查找即可。注意看objdump的manual,不是grep出了东西就一定表示该库中有这个函数,还要看前面的flag。
还有一个非常重要的内容:在一个静态链接的程序中,不能出现dlopen函数调用,看下面:
The dlopen/() function is available only to a dynamically-linked process. A statically-linked process (one where libc is linked statically) can't call dlopen() because a statically-linked executable:
* doesn't export any of its symbols
* can't export the required structure for libraries to link against
* can't fill structures at startup needed to load subsequent shared objects.