你的位置:首页 > 操作系统

[操作系统]由函数符号找不到联想到的动态链接过程


最近遇到一个因符号找不到导致程序无法启动的情况,下面是我自己创建的一个栗子;

test1.c,后面将会编译成libtest1.so

int fun2(){    return -1;}int (*pf)();int fun1(){    pf = fun2;    return pf() ;}

test3.c,调用libtest1.so中的函数fun1,

int fun1();int main(){    fun1();    return 1;}

这里讲两个elf文件中的知识,elf文件一般有两个符号表,分别是.dynsym和.symtab,和两个字符串表,分别是.dynstr和.strtab,做了一下实验如果是连接动态库时,修改后者是不会对连接以及运行时造成影响的,而如果是静态链接,那么两者必须全部都一致。

本来test3文件是可以运行的,现在我把dynstr中的fun2改成fun6,此时会出现下面的提示;

./test: symbol lookup error: libtest1.so: undefined symbol: fun6

提示fun6函数找不到,原先我以为elf文件在启动时是仅仅分析重定向表中的信息,那么现在看来是分析整个动态链接符号表,在分析动态链接符号表时的具体操作需要看内核或者elf文件的启动过程。

这边只是分析到elf文件启动时会解析动态连接符号表中的所有符号。