Все знают что при компилляции можно указать выравнивание структур данных по 1, 2, 4 и 8 байтовой границе. Проблема в том, что в одной ДЛЛ может быть установлено 4х байтововое выравнивание, а в другой 1 байтовое и т.д. Например, если при компиляции своего проекта указать "неверное" выравнивание структур данных, то при вызове экспортируемой функции из DLL можно повредить стек со всеми вытекающими... Какаким образом и откуда я могу узнать по какой границе выравнивались данные в той или иной библиотеке? например в наличии имеется DLL, LIB и .H файлы. Спасибо!
Чего??? какое выравниевание? Если написать A dd 0 B db 1 то это будет структура из 5-и байт независимо от выравнивания. Возможно имеется ввиду выравнивание начала структур по границе, кратной какому-нить числу.
2 Turkish если выравнивание равно 1, то это структура из 5 байт, а если 4 - то из восьми! Я сам с этим продолбался два дня, пока понял, в чем дело... Сумма размеров всех полей структуры равнялась 512 байт, но сама структура в памяти занимала 520 байт, соответственно, и на диск вместо одного сектор азаписывалось 1 сектор и еще 8 байт. Задолбался, пока нашел... Так что зря ты так...
Если здесь говорится про компилятор "C", а не ассемблер, то прямо в коде нужная структура окружается командами pragma: Код (Text): #pragma pack (1) // Align on 1 byte typedef struct tag_ITEM { char ProductCode [3]; char ProductType; } ITEM; #pragma pack (8) // Align on 8 bytes
я спрашивал о том, как и где достать инфу о том как выровнены данные в DLLках если в наличии есть собсно ДЛЛки, их ЛИБы и куча .Н файлов. похоже что нигде и никак =(
правильнее было бы написать #pragma pack(pop) а в начале #pragma pack(push, 1) S_T_A_S_ наверняка есть и если все пИсано по уму то и с прагмами
вообще то по умолчанию все ДЛЛки в винде имеют выравнивание 4 байта. если только самому не поизвращаться в _своей_ ДЛЛке.