最近遇到一个因符号找不到导致程序无法启动的情况,下面是我自己创建的一个栗子;
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文件启动时会解析动态连接符号表中的所有符号。
原标题:由函数符号找不到联想到的动态链接过程
关键词:函数