-2

我们尝试将我们的虚拟机移植到Net Bsd 7.0 (amd64) 上。已经成功地从 Linux 移植到 Free BSD 和 Open BSD 等。我们在全新的标准安装 Net BSD 上有几个问题。

  1. 代码使用 gcc 和以下标志编译:CC_OPTIONS=-pedantic -Wall -Wno-trigraphs -Wno-long-long -Wno-variadic-macros -fshort-wchar -x c++ -fPIC -pipe -fno-omit-frame-指针 -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
    {
    union

      {
      pthread_spinlock_t HandleSpinLock;
      } 选择;
    } *TypMttSysNatSynchronisationDirect;

    TypMttSysNatSynchronisationDirect SynchronisationCourant;
    诠释回应;

    SynchronisationCourant=(TypMttSysNatSynchronisationDirect)malloc(sizeof(struct typmttsysnatsynchronisationdirect));
    if (SynchronisationCourant==NULL)
      返回(0);
    memset(SynchronisationCourant, 0x0, sizeof(struct typmttsysnatsynchronisationdirect));
    响应=pthread_spin_init(&(SynchronisationCourant->Selection.HandleSpinLock), PTHREAD_PROCESS_SHARED);
    如果(响应!=0)
      返回(0);
    响应=pthread_spin_lock(&(SynchronisationCourant->Selection.HandleSpinLock));
    如果(响应!=0)
      返回(0);

当反汇编 pthread_spin_init() 和 pthread_spin_lock() 的代码时,似乎 pthread_spinlock 内部有一个函数指针,它在 pthread_spin_init() 中设置为 NULL,并被 pthread_spinlock() 调用的 pthread_spintrylock() 间接调用。

感谢您的帮助。

4

1 回答 1

0

似乎每个模块都被编译器(gcc)标记为与多线程兼容或不兼容,并且生成的代码略有不同。而且您不能将两种模块混合到一个可执行文件中。特别是如果您使用 dlopen() 动态加载某些共享对象。

由于 msvc 有 /Mt 选项,gcc 有 -pthread 选项,但 Net BSD 不可用。而且在其他平台上是没用的。

解决方法是系统地将 libpthread.so 链接到每个模块。然后标记每个模块具有兼容的多线程。两个问题都结束了。

于 2016-10-14T12:19:48.857 回答