我正在为嵌入式系统交叉编译一个程序。该程序使用一个共享库,我像这样打开它。
#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'
此外,我尝试了一些 gcc 链接选项,如 rdynamic,总是得到相同的结果。
此外,我尝试使用不使用 _ZNSt8ios_base4InitD1Ev 的共享库,即“libc.so.0”来检查我的 c 代码是否正常工作。我只更改了名称和绝对路径,并删除了查找功能部分。它工作没有错误。
正如您可能从我的帖子中看到的那样,我刚刚开始交叉编译和使用动态库,所以也许我的错在其他地方。此外,我不确定我是否明白问题出在哪里,所以欢迎任何提示。如果您需要更多信息,我很乐意将它们提供给您。
问候,平谷