9

UNIX ベースのシステムで等価な遅延負荷は何ですか。

私はコードを持っていますfoo.cpp.gccでコンパイルしている間、それを共有オブジェクトにリンクします(合計3つの.soファイルがあります.)。異なるオプションの .so ファイルのそれぞれ。

./foo -vニーズlibversion.so ./foo -updateニーズlibupdate.so

これらのライブラリのシンボルは、実行時にのみ解決する必要があります。

./foo -vlibupdate.so ライブラリが存在しなくても壊れません。

(dllのプロパティで)遅延ロードオプションを使用してWindowsで動作しています。UNIXシステムで同等のものは何ですか。

-lazyオプションは UNIX でも同じことを行いますか? その場合、このオプションをどこに含めますか: makefile またはリンカ ld?

4

2 に答える 2

3

dlopen() については、システムのリファレンスを参照してください。ライブラリを手動で開き、リンク時ではなく実行時に外部シンボルを解決できます。

例を掘り出します:

int main(int argc, char **argv) {                 
    void *handle=NULL;                                 
    double (*myfunc)(double);                     
    char *err=NULL;                                  

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY);
    if (!handle) {                                
        err=dlerror();
        perror(err);
        exit(1);                                  
    }                                             

    myfunc = dlsym(handle, "sin");                
    if ((err = dlerror()) != NULL)  {           
        perror(err);
        exit(1);                                  
    }                                             

    printf("sin of 1 is:%f\n", (*myfunc)(1.));              
    dlclose(handle);            
    return 0;                  
}                                                 
于 2010-06-02T12:00:45.440 に答える
1

8年経ったけどまだ…

dlopen遅延読み込みは、GNU システムではそのままではサポートされていませんが、必要なすべてのシンボルと最初の呼び出し (またはプログラムの起動時) での実際の実装を提供する小さな静的スタブを作成することで、独自に模倣することができます。このようなスタブは、プロジェクト固有のスクリプトまたはImplib.so ツールによって生成された、手動で作成できます。

# Replace
$ gcc -o foo foo.c -lversion
# with
$ implib-gen.py libversion.so
$ gcc -o foo foo.c libversion.tramp.S libversion.init.c
于 2018-02-16T09:18:24.443 に答える