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