2014-11-11 7 views
1

Ошибка динамической загрузки DLL, статически связанной с libz3.dll, GetlastError после неудачной загрузки. LoadLibrary возвращает ошибку «Недопустимый доступ к ячейке памяти». Можно ли динамически загрузить libz3.dll?Динамическая загрузка libz3.dll

ответ

0

Я не уверен, что здесь означает «статически связанное с libz3.dll», но в общем случае да, можно динамически загружать libz3.dll (наши API тоже делают это). Одной из часто встречающихся проблем является то, что система не обеспечивает хорошее сообщение об ошибке, когда возникает конфликт 32/64 бит, например, 32-разрядная версия Python отказывается загружать 64-разрядную DLL и наоборот, предоставляя сообщения об ошибках, которые по существу говорят «нет libz3.dll».

В данном конкретном случае жалоба о недействительном доступе к памяти может указывать на наличие проблемы в «статически связанной» части.

+0

Статически связанный с dll означает, что эта DLL напрямую вызывает функции из libz3.dll, LoadLibrary не используется. – nevilad

1

Отладка показывает, что инициализация libz3.dll не работает в void * memory :: allocate (size_t s) в этой строке: g_memory_thread_alloc_size + = s;

та же строка в ассемблере:

MOV EAX, DWORD PTR [__tls_index (0A79058h)]

мы ECX, DWORD PTR фс: [2CH]

MOV EAX, DWORD PTR [ECX + eax * 4]

Значение g_memory_thread_alloc_size загружается в регистр eax из местоположения с именем __tls_index. В программе есть только один поток: значение в __tls_index равно нулю. Fs указывает на TEB, fs: [2Ch] указывает на TEB.ThreadLocalStorage. Следующее чтение получает ecx = 0. Поэтому проблема заключается в неинициализированном указателе на TLS.

Я запускаю exe на сервере Windows 2003. Неофициальное описание реализации TLS говорит, что до неявного TLS Windows Vista (с использованием declspec (thread)) не работает , когда модуль, использующий его, не загружается во время инициализации процесса (во время статического разрешения импорта).

Это значит, что дистрибутив libz3.dll не может быть динамически загружен на Windows раньше, чем Vista.

Повторная компиляция dll без использования хранилища потоков (я изменил значение #if (_WINDOWS) || определено (_USE_THREAD_LOCAL) на #if 0) решает проблему. Как я понимаю, не используя для хранения , это нормальное поведение для других ОС, чем Windows. Можно ли использовать это решение в Windows?

+0

Да, это правильно. Z3 использует потоковое локальное хранилище, и поэтому он не будет работать на старых версиях Windows. Мы это осознаем, но мы должны провести линию где-то. Отключение локального хранилища потоков, как было предложено, безопасно до тех пор, пока не задействован параллелизм (обратите внимание, что потоки Linux/OSX также используются для обработки тайм-аута, а также тайм-аут, используемый в Windows, с надеждой на это). –

Смежные вопросы