VC6: Проблемы с импортом в Release версии

Тема в разделе "WASM.SOFTWARE", создана пользователем rmn, 2 сен 2006.

  1. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    Суть проблемы в следующем: при запуске release-версии программы, лоадер записывает в IAT адрес не той функции, что указана в импорте. На скриншоте в аттаче видно пример. Вместо адреса LockResource там адрес SetHandleCount, причем функции SetHandleCount нет в импорте вообще, даже текстовой строки в файле нет такой.
    Кто-нибудь сталкивался с таким? Что делать? :)

    win2k sp4

    p.s.
    В debug-версии все нормально.

    p.p.s
    нет аттача, видимо, размерчик большой. :)

    http://rapidshare.de/files/31673036/vc6.LockResource.rar.html 225K
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Эта функция в XP имеет 2 имени: LockResource и SetHandleCount:
    Код (Text):
    1. ; Exported entry 597. LockResource
    2. ; Exported entry 784. SetHandleCount
    3.  
    4.  
    5. ; Attributes: bp-based frame
    6.  
    7. ; UINT __stdcall SetHandleCount(UINT uNumber)
    8. public SetHandleCount
    9. SetHandleCount proc near
    10.  
    11. uNumber= dword ptr  8
    12.  
    13. mov     edi, edi        ; LockResource
    14. push    ebp
    15. mov     ebp, esp
    16. mov     eax, [ebp+uNumber]
    17. pop     ebp
    18. retn    4
    19. SetHandleCount endp
    Кстати, как можно заметить, эта функция ничего не делает :)

    ЗЫ: А картинку можно было запросто в 20К поместить при нормальном сжатии.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    Точно, в 2к то же самое.

    Начитаешься тут msdn'ов и голову ломаешь в поисках багов там где их нет :)
    Интересно, сколько еще таких "полезных" функций в сист. библиотеках?..

    Я пробовал. Не получилось :)
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    Итак, баг был в следующем:

    Программка хранит в ресурсах данные которые во время работы слегка модифицирует и сохраняет в файл. Падать начала в release-сборке при попытке записи по указателю, возвращаемому LockResource (хм, LoadResource :)).
    Багов в виндовском лоадере нет, все оказалось проще :) Память по этому адресу (секция .rsrc) доступна только на чтение, и в debug-версии обработчик исключения (отсутствующий в release) изменял атрибуты секции на Read-Write, повторял запись по указателю и устанавливал атрибуты обратно в ReadOnly.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    rmn
    А в msdn по этому поводу чётко написано, что буфер LockResource доступен только для чтения. Зря Вы разочаровались в msdn ;)

    Можно в опциях линкера задать секции rsrc атрибут W.