C调用函数类型错误

时间:2016-08-21 09:40:25

标签: c linker-errors undefined-reference

我试图编译这个从" libcfmapi.so调用func的代码"解密" cfg"文件

#include <stdlib.h>
#include <stdio.h>
int restorebackup(const char *tmp_cfg_name,const char *xml_cfg_name);
int ATP_CFM_ExtCustomImportEncryptedUserCfgFile(const char *tmp_cfg_name);
int main(int argc, char **argv)
{
int ret;
if(argc < 3)
{
printf("specify temp config file name.\n");
exit(1);
}
ret=restorebackup(argv[1],argv[2]);
return ret;
}
int restorebackup(const char *tmp_cfg_name,const char *xml_cfg_name)
{
int ret=0;
//ret = ATP_CFM_ExtDigVerifyFile(tmp_cfg_name,tmp_cfg_name);
if(ret != 0)
{
printf("Verify File failed.\n");
return ret;
}
ret = ATP_CFM_ExtCustomImportEncryptedUserCfgFile(tmp_cfg_name);
return ret;
}

但是有关func type declare的错误

root@kali:~/debian-qemu# gcc  h.c   -o demo
    /tmp/ccVbt5NT.o: In function `restorebackup':
    h.c:(.text+0x8c): undefined reference to `ATP_CFM_ExtCustomImportEncryptedUserCfgFile'
    collect2: error: ld returned 1 exit status

任何帮助表示赞赏

3 个答案:

答案 0 :(得分:0)

您收到此错误的原因是您没有链接到所需的库libcfmapi.so

这不是您期望在Debian系统中找到的库,因为它是您尝试入侵的BT设备所独有的。

简而言之 - 从您的设备获取lib,针对从设备中提取的lib交叉编译到设备架构,您应该没问题。

答案 1 :(得分:0)

基于Ishay Peled回答的更多信息:

readelf -s <pulled library> | grep ATP_CFM_ExtCustomImportEncryptedUserCfgFile

我怀疑问题不在于您调用的功能不存在,而是没有显示任何功能,它很可能是空的,就像nm结果一样:

  

nm:libcfmapi.so:无符号

执行命令而没有管道到grep,我的赌注是你的输出是:

readelf -s libcfmapi.so
  

动态符号信息不可用于显示符号。

如果有人知道从文件中获取标题的方式,我相信你可以找到你需要的功能然后链接和运行(我也尝试使用libcfmapi.so,但缺乏编程/需要的编程/反向知识)

答案 2 :(得分:-2)

使用库时,必须:

  1. 通过

    在链接语句中包含该库

    -l cfmapi

  2. 在源代码中包含该库的头文件:

    #include <cfmapi.h>