我被告知:
如果您的程序引用了库中的10个函数,但调用了其中的0个,则延迟绑定与立即绑定的区别是0与10查找。如果您的程序引用了库中的100个函数,但只调用其中的10个,则不同之处在于查找10个与查找100个
以下是我的代码和我的理解:
main.c
// this program references func_lib but doesn't call func_main
void func_lib();
void func_main()
{
func_lib();
}
int main()
{
return 0;
}
mylibrary.c
void func_lib()
{
...
}
并且在mylibrary.c
的基础上生成了一个共享库mylibrary.so
,让我们将main.c
和mylibrary.so
链接到一个名为prog
的可执行文件中,所以根据引用的文本,func_lib
被程序引用,但没有延迟绑定,func_lib
有一个查找(我认为查找意味着由链接器执行的重新定位(
但我使用readelf
检查了prog
,.rel.text
中没有条目,prog
的任何部分中都没有func_lib
的条目,因为程序甚至不调用func_main
,这意味着链接器不会对func_lib
进行任何查找/重新定位?
声明不引用任何内容。函数声明所做的只是告诉编译器如何处理func_lib
的参数,并在调用时返回值;如果不调用函数,则该信息是不相关的。(这通常是大多数标准库的情况。(
要想有引用,实际上必须以某种方式使用符号——例如,包含一个调用func_lib
的函数。(如果函数本身从未被调用也没关系,只要它有外部链接,因此可以从其他翻译单元调用。(