2013-10-17 16 views
0

我創建了一個庫來提供對另一個庫的訪問。 有問題的庫是供應商,所以不是每個人都應該訪問這個庫。 這樣做的一個解決方案是將該庫放在特定組(AIX)上,然後將可以使用它編譯的所有人都放在同一組中。 此解決方案在這裏不起作用,因爲有很多新人進出,編譯的用戶(執行此操作的進程)與可以訪問代碼的用戶不同。 我試圖歸檔的解決方案是。 每個應用程序在其目錄中都有一個模式。 /Aplications/Group/... 因此,我可以在程序運行時使用該文件夾。 我想要做的是。 創建一個庫,用於檢查目錄,然後使用(loadAndInit)在AIX上加載所有符號的dlopen函數加載庫,所以我不需要dlsym。 問題是,我想把我想要加載到我的源代碼庫的二進制代碼。原因:因爲如果App - > Lib(Loads) - > Vendor,沒有任何東西可以限制開發人員通過手動鏈接或手動編譯App - > Vendor。 而調用編譯過程的結構不能限制這一點。將二進制文件作爲字符串存儲在我的代碼中

我試過了。

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(我有它來測試)調用,並使用十六進制格式化庫它的工作原理不負載。 但是,因爲我將我的二進制代碼轉換爲十六進制,我試圖加載它,它不工作。 我應該轉換回加載它的內存,並再次使用它作爲一個庫?

這似乎一起工作,因爲圖書館是一個供應商我不能改變它,這是我看到限制訪問,因爲我們這裏有1000個多名程序員

+0

使用靜態鏈接 – Erbureth

+0

不能二進制數據存儲爲一個字符串。考慮一下如果二進制數據包含一個零值的字節(a.k.a.'''\ 0'',又名字符串終結符)會發生什麼。 –

+0

但是如果我把printf作爲\ x它打印爲\ x0,所以\ 0應該可以工作,另一件我做的事情就是對我的fmemopen做一個fwrite,並且告訴它它的大小並且寫成一個二進制文件 – Lefsler

回答

0

我解決它的唯一方法唯一的解決辦法使用

printf(「\ x%02x」,thechar);

裏面的GETC環

所以我寫了它的memcpy裏面,然後我複製到內存中,以便二進制文件存儲爲十六進制的數據。

完美的作品

相關問題