0

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

为什么:因为如果 App -> Lib (Loads) -> Vendor,没有什么可以限制开发人员手动创建链接或手动编译 App -> Vendor。而调用编译过程的结构不能限制这一点。

我已经尝试过。

转换库

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, "");

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

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

4

1 回答 1

0

我用它解决了

printf("\x%02x", thechar);

在 getc 循环内部

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

完美运行

于 2013-11-12T17:06:41.960 回答