将二进制文件存储为代码中的字符串

时间:2013-10-17 12:38:52

标签: c aix dlopen

我正在创建一个库来提供对另一个库的访问。 有问题的库是供应商,因此不是每个人都应该访问此库。 这样做的一个解决方案是将库放在特定的组(AIX)上,然后将可以使用它编译的每个人放在同一个组中。 此解决方案在此处不起作用,因为有许多新人进出,编译的用户(执行此操作的进程)与可以访问代码的用户不同。 我试图存档的解决方案是。 每个应用程序的目录都有一个模式。 / Aplications /组/ ... 因此,我可以在程序运行时使用该文件夹。 我想做的是。 创建一个检查目录的库,然后使用(loadAndInit)在已加载所有符号的AIX上的dlopen函数加载库,因此我不需要dlsym。 问题是,我想把我想加载的库的二进制代码放在我的源代码中。

为什么:因为如果App - > Lib(载荷) - >供应商,没有什么可以限制开发人员手工制作链接或手工编译App - >供应商。 调用编译过程的结构不能限制它。

我尝试了什么。

Convertlib

FILE* file=fopen("vendor.so", "rb");
int c;
do{
   c=getc(file);
   if(c > 0)
      printf("\\x%02x", c);
}while(c!=EOF);

然后我有一个小脚本将此文件的输出作为

char *lib=(char* (malloc(sizeof(char) * /* lib size */));
lib="/*output of the Convertlib*/

然后我尝试使用fmemopen加载它,所以我不在我的进程区域内创建一个临时文件只是一个文件描述符。

要加载它我

FILE* vendorLib=fmemopen(lib, /*libSize*/, "r");
char path[50];
sprintf("/proc/%d/fd/%d", getpid(), fileno(vendorLib));
loadAndInit(path, 0, "");

如果我直接调用lib(我要测试它)并且不使用hex格式库加载它可以工作。 但是当我将二进制代码转换为十六进制并且我正在尝试加载它时,它不起作用。 我应该转换回来加载到内存并再次用作库吗?

这似乎是唯一可以使用的解决方案,因为库是供应商,我无法更改它,这是我看到限制访问的唯一方式,因为我们这里有超过1000名程序员

1 个答案:

答案 0 :(得分:0)

我用

解决了它

printf(“\ x%02x”,thechar);

在getc循环中

所以我把它写在memcpy中然后我复制到内存中,所以二进制文件存储为HEX数据。

完美运作

相关问题