別のライブラリへのアクセスを提供するライブラリを作成しています。問題のライブラリはベンダーであるため、すべての人がこのライブラリにアクセスできるわけではありません。そのための 1 つの解決策は、ライブラリーを特定のグループ (AIX) に配置し、それを使用してコンパイルできるすべてのユーザーを同じグループに配置することです。このソリューションはここでは機能しません。多くの新しい人が出入りしているためです。コンパイルするユーザー (この操作を実行するプロセス) は、コードにアクセスできるユーザーと同じではありません。私がアーカイブしようとしている解決策は. すべてのアプリケーションのディレクトリにはパターンがあります。/Aplications/Group/... したがって、プログラムの実行時にフォルダーを使用してグループを取得できます。私がやろうとしていることはです。ディレクトリをチェックするライブラリを作成し、(loadAndInit) を使用してライブラリをロードします。AIX では、既にすべてのシンボルをロードしています。だから私は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, "");
ライブラリを直接呼び出して(テストする必要があります)、16進形式のライブラリを使用してロードしないと、機能します。しかし、バイナリ コードを 16 進数に変換してロードしようとしても、うまくいきません。変換してメモリにロードし、再度ライブラリとして使用する必要がありますか?
ライブラリはベンダーであるため、これを変更することはできません。ここには1000人以上のプログラマーがいるため、アクセスを制限する唯一の方法です。