-2

仮想マシンをNet Bsd 7.0 (amd64)に移植しようとしています。すでに Linux から Free BSD や Open BSD などに移植され、成功しています。Net BSD の新規および標準インストールに関して、いくつかの問題があります。

  1. コードは gcc と次のフラグでコンパイルされます。ポインター -g -I"/usr/local"/include -I"$(UAS_SRC)"
    LD_OPTIONS=-shared-libgcc -L"/usr/lib" -L"/usr/local/lib" -L"$( UAS_HOME)vtm/lib"

  2. pthread_create () でスレッドを作成しようとすると、プロセスは libc ランタイムからSIGABRTを受け取ります: gdb backtrace:

    • /usr/lib/libc.so.12 の _lwp_kill() で
    • /usr/lib/libc.so.12 の __lwd_thr_create_stub() で
    • /usr/libpthread.so.1 の _pthread_create() で
    • /home/../syspsx_nt.cpp の CreerThread2() で
  3. スピン ロックを使用しようとすると、セグメント違反が発生します。テストケースは次のとおりです。

    typedef struct typmttsysnatsynchronisationdirect
    {
    ユニオン

      {
      pthread_spinlock_t HandleSpinLock;
      } 選択;
    } *TypMttSysNatSynchronisationDirect;

    TypMttSysNatSynchronisationDirect SynchronisationCourant;
    int 応答;

    SynchronisationCourant=(TypMttSysNatSynchronisationDirect)malloc(sizeof(struct typmttsysnatsynchronisationdirect));
    if (SynchronisationCourant==NULL)
      リターン (0);
    memset(SynchronisationCourant, 0x0, sizeof(struct typmttsysnatsynchronisationdirect));
    Reponse=pthread_spin_init(&(SynchronisationCourant->Selection.HandleSpinLock), PTHREAD_PROCESS_SHARED);
    if (応答!=0)
      リターン (0);
    Reponse=pthread_spin_lock(&(SynchronisationCourant->Selection.HandleSpinLock));
    if (応答!=0)
      リターン (0);

pthread_spin_init() と pthread_spin_lock() のコードを逆アセンブルすると、pthread_spinlock() で NULL に設定され、pthread_spinlock() によって呼び出される pthread_spintrylock() に間接的に呼び出される関数ポインタが pthread_spinlock 内にあるようです。

助けてくれてありがとう。

4

1 に答える 1

0

各モジュールはコンパイラ(gcc)によってマルチスレッド対応か否かのタグが付けられているようで、生成されるコードもそれに合わせて若干変更されているようです。また、2 種類のモジュールを 1 つの実行可能ファイルに混在させることはできません。特に、dlopen() を使用して一部の共有オブジェクトを動的にロードする場合。

msvc には /Mt オプションがあるので、gcc には -pthread がありますが、Net BSD には使用できません。また、他のプラットフォームでは役に立ちません。

回避策は、libpthread.so を各モジュールに体系的にリンクすることです。次に、各モジュールにタグが付けられ、互換性のあるマルチスレッドがあります。そして、2つの問題は終わりました。

于 2016-10-14T12:19:48.857 に答える