我正在创建一个库以提供对另一个库的访问。有问题的库是供应商,所以不是每个人都应该访问这个库。这样做的一种解决方案是将库放在特定组 (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 多名程序员