32ビットマシンで書かれたコードがたくさんあります。今は64ビットにアップグレードしましたが、共有オブジェクトはロードされません。共有オブジェクトは32ビット(DMDの場合は-m32
フラグ)でコンパイルされ、ホストアプリケーションも同様にコンパイルされます。 これは共有ライブラリです:共有オブジェクトが読み込まれず、dlopenでセグメント化エラーが発生する
module lib;
export extern(C) int abcd(){
return 4;
}
それはdmd -shared -m32 lib.d
を使用してコンパイルされ、出力はlib.so
であり、これはローダー用のコードです:
module loader;
import std.stdio;
import core.sys.posix.dlfcn;
alias func = extern(C) int function();
void main(string[] args){
writeln("reached 0, press enter");readln;
void* so = dlopen("/home/nafees/Desktop/temp/lib.so",RTLD_LAZY);
writeln("reached 1, press enter");readln;
func f = cast(func)dlsym(so,"abcd");
writeln((*f)());
}
はこの1がdmd -m32 loader.d
を使用してコンパイルされます。それはうまくコンパイルされますが、実行するとdlopen
まで正常に実行され、segmentation fault(core dumped)
が発生します。これは32ビットで正常に動作していました。
このコードで何が問題なのですが、なぜ機能しませんか?
P.S:私は64ビット用にコンパイルしたくないので、ソリューションに-m32
を削除する必要がある場合は、別のものが必要です。
EDIT:dlopenを使用して共有オブジェクト(Dでも書かれています)をロードするプログラムをコンパイルしました(Dでも書かれています)。そのプログラムは32ビットで正常に動作しますが、64ビットマシンでは正常に動作しません。
EDIT2:私は今、-m32なしでローダーをコンパイルしようとした、それは今dlerrorはこれを言っている:/home/nafees/Desktop/temp/lib.so: wrong ELF class: ELFCLASS32
あなたは、GCDなどの他のコンパイラ、と試みたことがありますか? –
gdcにも同じ問題があります。 – Nafees