Ошибка динамической загрузки DLL, статически связанной с libz3.dll, GetlastError после неудачной загрузки. LoadLibrary возвращает ошибку «Недопустимый доступ к ячейке памяти». Можно ли динамически загрузить libz3.dll?Динамическая загрузка libz3.dll
ответ
Я не уверен, что здесь означает «статически связанное с libz3.dll», но в общем случае да, можно динамически загружать libz3.dll (наши API тоже делают это). Одной из часто встречающихся проблем является то, что система не обеспечивает хорошее сообщение об ошибке, когда возникает конфликт 32/64 бит, например, 32-разрядная версия Python отказывается загружать 64-разрядную DLL и наоборот, предоставляя сообщения об ошибках, которые по существу говорят «нет libz3.dll».
В данном конкретном случае жалоба о недействительном доступе к памяти может указывать на наличие проблемы в «статически связанной» части.
Отладка показывает, что инициализация 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?
Да, это правильно. Z3 использует потоковое локальное хранилище, и поэтому он не будет работать на старых версиях Windows. Мы это осознаем, но мы должны провести линию где-то. Отключение локального хранилища потоков, как было предложено, безопасно до тех пор, пока не задействован параллелизм (обратите внимание, что потоки Linux/OSX также используются для обработки тайм-аута, а также тайм-аут, используемый в Windows, с надеждой на это). –
- 1. Динамическая загрузка DLL
- 2. Динамическая загрузка DLL в другую DLL
- 3. Динамическая загрузка dll и googletest
- 4. Динамическая загрузка DLL после ILMerge
- 5. Проверка dll Excel и динамическая загрузка
- 6. Delphi DLL Organization - Статическая и динамическая загрузка
- 7. Динамическая загрузка и использование DLL в C#
- 8. Динамическая загрузка Silverlight: Xap или Dll?
- 9. Динамическая загрузка Leadtools DLLs
- 10. Динамическая загрузка Silverlight XAP
- 11. Динамическая загрузка Ассамблеи
- 12. Динамическая загрузка нескольких версий сборки
- 13. Динамическая сборка и загрузка
- 14. .net динамическая загрузка
- 15. Динамическая загрузка DLL приложений на основе открытого файла
- 16. Asp.net, динамическая загрузка элементов управления сервера из DLL
- 17. Может ли динамическая загрузка C++/cli dll из памяти?
- 18. Динамическая загрузка и выгрузка dll, сгенерированного с использованием CSharpCodeProvider
- 19. Динамическая загрузка сборки .NET с некоторой другой зависимостью dll
- 20. Windows - динамическая загрузка библиотеки C++
- 21. AngularJs Динамическая загрузка
- 22. AngularJS Динамическая загрузка контроллера
- 23. Динамическая загрузка многоугольник
- 24. Динамическая загрузка ListView
- 25. Динамическая загрузка изображения AngularJS
- 26. Динамическая загрузка реактивных компонентов
- 27. Динамическая загрузка UIWebview
- 28. Динамическая загрузка изображений
- 29. Динамическая загрузка NIB?
- 30. Динамическая загрузка баночки
Статически связанный с dll означает, что эта DLL напрямую вызывает функции из libz3.dll, LoadLibrary не используется. – nevilad