无法解析符号

时间:2012-12-17 17:14:50

标签: c shared-libraries

我正在交叉编译嵌入式系统的程序。该程序使用一个共享库,我打开这样的。

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>      //needed for dynamic linking

void  *FunctionLib;     //Handle to shared lib file
int   (*Function)();    //Pointer to loaded routine
const char *dlError;    //Pointer to error string

int main( argc, argv )
{
    int   rc;               //return codes
    printf("start...\n");

    //Open Dynamic Loadable Libary with absolute path
    FunctionLib = dlopen("/lalabu/sharedLib.so",RTLD_LAZY | RTLD_GLOBAL);
    dlError = dlerror();
    printf("Open sharedLib.so returns: %s \n", dlError);
    if( dlError ) exit(1);

    //Find function
    Function = dlsym( FunctionLib, "getSomething");
    dlError = dlerror();
    printf("Find symbol getSomething returns: %s \n", dlError);
    if( dlError ) exit(1);
...

我正在使用以下命令编译代码

mips-linux-uclibc-gcc -Wall -ldl ./dynamic_linking.c -o /dynamic_linking

没有任何警告和东西 如果我现在尝试在我的设备上执行此代码,则会出现以下错误:

# ./dynamic_linking
start...
Open sharedLib.so returns: (null)
Find symbol getSomething returns: Unable to resolve symbol
./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev'

如果我看看IDA哪个函数sharedLib.so想要导入,我会看到函数(或符号?)'_ ZNSt8ios_base4InitD1Ev'以及它应该在哪里(libc.so.0)。
如果我再次使用IDA来查看libc.so.0,我看不到像这样的函数。也不像ios_base,ios或base 我已尝试使用dlopen()的各种标志组合,这总是出现上述错误,除非我使用RTLD_NOW而不是RTLD_LAZY我得到

Segmentation fault (core dumped)

而不是

./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev'

此外,我尝试了一些像rdynamic这样的gcc链接选项,总是有相同的结果 此外,我试图使用不使用_ZNSt8ios_base4InitD1Ev的共享库,'libc.so.0'来检查我的c代码是否正常工作。我只更改了名称和绝对路径并删除了查找功能部分。它没有错误地工作 正如您可能从我的帖子中看到的那样,我刚刚开始交叉编译和使用动态库,所以也许我的错在其他地方。此外,我不确定我是否了解问题所在,所以任何提示都是受欢迎的。如果您需要进一步的信息,我很乐意将它们交给您 问候,Pingu

1 个答案:

答案 0 :(得分:3)

_ZNSt8ios-base4InitD1Ev不是C符号,而是C ++符号。

$ echo _ZNSt8ios-base4InitD1Ev | c++filt

不提供任何线索,但如果您将-替换为_(可能是一个错字?):

$ echo _ZNSt8ios_base4InitD1Ev | c++filt
std::ios_base::Init::~Init()

这就是C ++ STD库内部类的析构函数。因此,您应该检查libstdc++.so库而不是libc.so

我的建议是使用G ++编译程序,以便正确初始化C ++库。它不是动态加载的,这就是分段错误的原因。