2016-10-08 10 views
1

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

+0

あなたは、GCDなどの他のコンパイラ、と試みたことがありますか? –

+0

gdcにも同じ問題があります。 – Nafees

答えて

3

代わりのdlopenのは、loadLibraryを使用するようにしてください。

UPDATE:コンパイルlib.dため

使用-fPICフラグ: DMD -m32 -fPIC -shared lib.d

+0

これは私がRuntime.loadLibraryを使用しようとすると何が起こるかです:〜/デスクトップ/一時$ DMD -m32 loader.d loader.o::のOptiPlex-755 @ ナフィーズ機能では '_D4core7runtime7Runtime17__T11loadLibraryZ11loadLibraryFxAaZPv ': loader.d :(。 text._D4core7runtime7Runtime17__T11loadLibraryZ11loadLibraryFxAaZPv + 0x4d):rt_loadLibrary」 collect2は '未定義の参照:エラー:ldは1つの終了ステータス を返さ---実行時の依存関係になるだろうDMD -defaultlib = libphobos2.so – Nafees

+0

試してみます私はそれを望んでいません。 Dのようなものはランタイムに依存していないようです(私は嘘をつきました)。 – Kozzi11

+0

でそれを構築するためのERRORLEVEL 1 ' – Nafees

関連する問題