c-链接器是否对程序中引用但未实际调用的函数进行重新定位



我被告知:

如果您的程序引用了库中的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.cmylibrary.so链接到一个名为prog的可执行文件中,所以根据引用的文本,func_lib被程序引用,但没有延迟绑定,func_lib有一个查找(我认为查找意味着由链接器执行的重新定位(

但我使用readelf检查了prog.rel.text中没有条目,prog的任何部分中都没有func_lib的条目,因为程序甚至不调用func_main,这意味着链接器不会对func_lib进行任何查找/重新定位?

声明不引用任何内容。函数声明所做的只是告诉编译器如何处理func_lib的参数,并在调用时返回值;如果不调用函数,则该信息是不相关的。(这通常是大多数标准库的情况。(

要想有引用,实际上必须以某种方式使用符号——例如,包含一个调用func_lib的函数。(如果函数本身从未被调用也没关系,只要它有外部链接,因此可以从其他翻译单元调用。(

最新更新