LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.

Я, кстати, встречал приколы поинтереснее.

Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:

static int foo(int a, int b, int c, int d)
{
   ... /* тут куча кода */
   return blabla;
}

int bar(int a, int b, int d)
{
   return foo(a, b, some_const, d);
}

Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. (Дело на 32-битной x86 машине было.) И дальше делает jmp _foo.

А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo был, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.

Исправление wandrien, :

Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.

Я, кстати, встречал приколы поинтереснее.

Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:

static int foo(int a, int b, int c, int d)
{
   ... /* тут куча кода */
   return blabla;
}

int bar(int a, int b, int d)
{
   return foo(a, b, some_const, d);
}

Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. (Дело на 32-битной x86 машине было.) И дальше делает jmp _foo.

А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo бы, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.

Исправление wandrien, :

Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.

Я, кстати, встречал приколы поинтереснее.

Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:

static int foo(int a, int b, int c, int d)
{
   ... /* тут куча кода */
   return blabla;
}

int bar(int a, int b, int d)
{
   return foo(a, b, some_const, d);
}

Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. И дальше делает jmp _foo.

А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo бы, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.

Исходная версия wandrien, :

Да, вроде бы довольно очевидная вещь любому, кто хоть раз изучал листинги генерируемого кода.

Я, кстати, встречал приколы поинтереснее.

Есть экспортируемая из модуля функция, которая вызывает static функцию примерно вот так:

static int foo(int a, int b, int c, int d)
{
   ...
   return blabla;
}

int bar(int a, int b, int d)
{
   return foo(a, b, some_const, d);
}

Что делает gcc? Первое - он назначает для foo типа вызова fastcall. Второе - в коде bar он переставляет аргументы прямо на стеке, ну а часть аргументов вообще идут в регистрах. И дальше делает jmp _foo.

А потом программист (я) смотрит на коре дамп и понять не может, почему выше по стеку вызов foo бы, вызов bar тоже был, а на стеке корректного фрейма ни для bar, ни для foo нигде нет.