При разработке программ для KolibriOS выяснил такую особенность. Если функция написана не на C , а линкуется из объектного файла написанного на другом языке программирования, например на ассемблере,то GCC считает, что функция не очищает стек от параметров. То есть если вы передаёте функции N параметров, то после её вызова GCC убирает из стека эти N параметров. Сначала я не знал про эту особенность и мои программы часто убивались, но после её учёта всё заработало. Для функций линкующихся статически эту особенность можно учесть, а как быть с динамическими функциями ? Например функции из libGUI (я переписал библиотеку на stdcall) самостоятельно очищают содержимое стека от параметров. Как сказать GCC, что для функций динамических библиотек ненужно убирать параметры из стека ?
By development of programs for KolibriOS has found out such feature. If function is written not on C, and link from an objective file written on the other programming language, for example on the assembler GCC considers, that function does not clear a stack of parameters. That is if you transfer function N of parameters after its call GCC cleans from a stack these N parameters. First I did not know about this feature and my programs were frequently killed, but after its account all has earned. For functions linking statically this feature can be taken into account and how to be with dynamic functions? For example functions from libGUI (I have copied library on stdcall) independently clear contents of a stack of parameters. How to tell GCC, what for functions of dynamic libraries is unnecessary to clean parameters from a stack?
Features of compiler GCC. / Особенности компилятора GCC.
-
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
For example, this way:
Code: Select all
#define __stdcall __attribute__((stdcall))
extern "C" int __stdcall my_func_name(int first_param, char *second_param);
in code we trust
Кто-нибудь знает, Mingw может создавать файлы в формате elf32 или там pe-i386 намертво зашито ?
Спасибо mike.dld .Твой совет мне помог.Для Linux версии gcc это выглядит так:
Thank mike.dld.Your advice has helped me.For Linux versions gcc it looks so:
Thank mike.dld.Your advice has helped me.For Linux versions gcc it looks so:
Code: Select all
#define stdcall __attribute__ ((stdcall))
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
Столкнулся со случаем, когда GCC добавляет в код ошибку, неприемлемую для работы.
Значит так. Имеем структуру, которая заполняется значениями. Справа я написал правильные смещения полей структуры.
После компиляции в коде некоторые поля имеют неправильные смещения.
Существуют ли варианты обойти такие ошибки ? Или только через ассемблер...
Значит так. Имеем структуру, которая заполняется значениями. Справа я написал правильные смещения полей структуры.
Code: Select all
typedef unsigned int dword;
typedef unsigned short int word;
typedef unsigned char byte;
typedef struct InfoForButton
{
byte type; //0
byte flag; //1
word x; //2
word y; //4
word width; //6
word height; //8
dword image; //10 <----Here GCC make mistake (12 but not 10)
word imageX; //14
word imageY; //16
word imageSizeX; //18
word imageSizeY; //20
dword transparentColor;//24
dword text; //28
word textX; //32
word textY; //34
dword textcolor; //36
dword color1; //40
dword color2;
word mouseX;
word mouseY;
};
InfoButton1->type=0x91;
InfoButton1->flag=0;
InfoButton1->x=50;
InfoButton1->y=10;
InfoButton1->width=70;
InfoButton1->height=30;
InfoButton1->image=1;
InfoButton1->imageX=2;
InfoButton1->imageY=3;
InfoButton1->imageSizeX=4;
InfoButton1->imageSizeY=5;
InfoButton1->transparentColor=6;
InfoButton1->text=TextForButton1;
InfoButton1->textX=8;
InfoButton1->textY=9;
InfoButton1->textcolor=0;
InfoButton1->color1=0xaabbcc;
Code: Select all
movl -44(%ebp), %eax
movb $-111, (%eax)
movl -44(%ebp), %eax
movb $0, 1(%eax)
movl -44(%ebp), %eax
movw $50, 2(%eax)
movl -44(%ebp), %eax
movw $10, 4(%eax)
movl -44(%ebp), %eax
movw $70, 6(%eax)
movl -44(%ebp), %eax
movw $30, 8(%eax)
movl -44(%ebp), %eax
movl $1, 12(%eax) //<---- MISTAKE!!! 12 but not 10
movl -44(%ebp), %eax
movw $2, 16(%eax)
movl -44(%ebp), %eax
movw $3, 18(%eax)
movl -44(%ebp), %eax
movw $4, 20(%eax)
movl -44(%ebp), %eax
movw $5, 22(%eax)
movl -44(%ebp), %eax
movl $6, 24(%eax)
movl -44(%ebp), %eax
movl $0, 28(%eax)
movl -44(%ebp), %eax
movw $8, 32(%eax)
movl -44(%ebp), %eax
movw $9, 34(%eax)
movl -44(%ebp), %eax
movl $0, 36(%eax)
movl -44(%ebp), %eax
movl $11189196, 40(%eax)
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
Попробуй варианты с typedef struct {...} __attribute__((packed));
andrew_programmer
Это не ошибка. Компилятор старается выравнивать данные на адрес кратный размеру. Это ускоряет доступ к ним. Кроме __attribute__((packed)) есть #pragma pack() или опция -fpack-struct[=<n>] где n-выравнивание. Другой вариант - забить на экономию памяти и выравнивать данные так как это делает компилятор.
Это не ошибка. Компилятор старается выравнивать данные на адрес кратный размеру. Это ускоряет доступ к ним. Кроме __attribute__((packed)) есть #pragma pack() или опция -fpack-struct[=<n>] где n-выравнивание. Другой вариант - забить на экономию памяти и выравнивать данные так как это делает компилятор.
diamond и Serge
Спасибо за советы. Они мне помогли справиться с проблемой.
Это я писал тестовую программу для работы с libGUI из C. Программа отлично работает.
Спасибо за советы. Они мне помогли справиться с проблемой.
Это я писал тестовую программу для работы с libGUI из C. Программа отлично работает.
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
У меня вопрос не по GCC, но связан с программированием на C. Мне нужно заполнить часть полей структуры однотипными значениями(например int ) и иметь доступ к ним как к элементам массива. Это необходимо для того, чтобы в цикле заполнить эти поля значениями. Значений довольно много, поэтому я и пытаюсь найти способ заполнения части структуры в цикле. Если в структуре просто указать массив нужного размера, то это не срабатывает, так как в структуру заноситься указатель на массив, а не сам массив.
Существуют ли методы решения этой проблемы ?
Существуют ли методы решения этой проблемы ?
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
Если все элементы (ну или N первых) однотипные(имеют одинаковый размер), тогда преобразование типов тебе поможет, преабразуй например к (int*).
Ghost
В том то и проблема, что большие участки однотипных данных чередуются с участками, где содержаться данные разного типа. При создании компонента Bookmark надо в структуру заносить указатели на информацию о дочерних контролах, которые будут созданы. У меня на 6 закладках содержиться много однотипных контролов Text и Number. Прописывать вручную информацию о всех этих контролах - дело муторное(раньше вручную прописывал - много времени на это уходит).
В том то и проблема, что большие участки однотипных данных чередуются с участками, где содержаться данные разного типа. При создании компонента Bookmark надо в структуру заносить указатели на информацию о дочерних контролах, которые будут созданы. У меня на 6 закладках содержиться много однотипных контролов Text и Number. Прописывать вручную информацию о всех этих контролах - дело муторное(раньше вручную прописывал - много времени на это уходит).
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
ну попробуй для однотипных участков так:
typedef struct mystruct{
dword a, b, c, d;
byte e;
word f;
}ms;
for(int i = 0; i < 4; i++)
(dword*)(ms.a) = 0;
ну или что то типа того.
typedef struct mystruct{
dword a, b, c, d;
byte e;
word f;
}ms;
for(int i = 0; i < 4; i++)
(dword*)(ms.a) = 0;
ну или что то типа того.
Решил преобразовать структуру к одному типу данных и не мучаться, а разнотипные данные вверху будут.
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
Who is online
Users browsing this forum: No registered users and 1 guest