我们尝试将我们的虚拟机移植到Net Bsd 7.0 (amd64) 上。已经成功地从 Linux 移植到 Free BSD 和 Open BSD 等。我们在全新的标准安装 Net BSD 上有几个问题。
代码使用 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"当尝试使用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()
当尝试使用自旋锁时,我们会收到段违规。这是测试用例:
typedef struct typmttsysnatsynchronisationdirect
{
union-
{
pthread_spinlock_t HandleSpinLock;
} 选择;
TypMttSysNatSynchronisationDirect SynchronisationCourant;
诠释回应;
SynchronisationCourant=(TypMttSysNatSynchronisationDirect)malloc(sizeof(struct typmttsysnatsynchronisationdirect));
if (SynchronisationCourant==NULL)
-
返回(0);
响应=pthread_spin_init(&(SynchronisationCourant->Selection.HandleSpinLock), PTHREAD_PROCESS_SHARED);
如果(响应!=0)
-
返回(0);
如果(响应!=0)
-
返回(0);
当反汇编 pthread_spin_init() 和 pthread_spin_lock() 的代码时,似乎 pthread_spinlock 内部有一个函数指针,它在 pthread_spin_init() 中设置为 NULL,并被 pthread_spinlock() 调用的 pthread_spintrylock() 间接调用。
感谢您的帮助。