由函数符号找不到联想到的动态链接过程,函数符号


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

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文件启动时会解析动态连接符号表中的所有符号。

相关内容

    暂无相关文章