VS2015 и _tls_array
От: PavelCH  
Дата: 27.07.16 12:43
Оценка:
Добрый день!
Допустим я использую /NODEFAULTLIB. И допустим написал startup код вызывающий статические конструкторы и вызывающий деструкторы при выходе из программы.
Проблема с _tls_array. Компилятор (vs2015) создает ссылки на него при обращении к переменным использующим _declsec(thread) и при компиляции тестового проекта сообщает об ошибке:

Unresolved external __tls_array

Если же объявить эту переменную в стиле:
extern "C" unsigned long _tls_array = 0;

то ошибка возникает уже на этапе выполнения. Суть ее в том что при обращении к _declsec(thread) переменной генерируется примерно такой код
00F55D83  mov eax,dword ptr [_tls_index (0F5A198h)]  
00F55D88  mov ecx,dword ptr fs:[_tls_array (0F5A19Сh)]
00F55D8F  mov edx,dword ptr [ecx+eax*4]

где вместо _tls_array при использовании стандартной библиотеки появляется (0x2C).

Вообщем вопрос следующий: как правильно объявить внешний символ _tls_array чтобы компоновщик разместил его по абсолютному адресу 0x2C, а не по относительному адресу (как из примера 0F5A19С) ?
Нехай щастить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.