Почему GDB показывает другой порядок параметров для функции - PullRequest
1 голос
/ 06 октября 2019

Просматривая файл ядра (сгенерированный кодом C) с gdb, я не могу понять одну особенность между этими 2 кадрами

#2  increment_counter (nsteps=2, steps=0x7f3fbad26790) at gconv_db.c:393
#3  find_derivation (...) at gconv_db.c:426

Этот код из открытого источника glibc, гдеfind_derivation вызывает increment_counter как:

result = increment_counter (*handle, *nsteps);

*handle и steps относятся к одному типу, а функция increment_counter определяется как static

Почемуgdb показать, что 2 параметра имеют разный порядок?

Я почти уверен, что glibc был взят без изменений

1 Ответ

1 голос
/ 08 октября 2019

Почему GDB показывает, что два параметра имеют разный порядок?

GDB не знает ничего об источнике (кроме, возможно, где на диске он былнаходится во время сборки).

Он может отображать параметры (и их значения), потому что компилятор сообщил ему (встраивая отладочную информацию в объектный файл), какие параметры, в какихпорядок их появления, их типы и способ вычисления их значения.

Так почему бы компилятору переупорядочивать аргументы функции?

Функция равна static, поэтому она не может бытьвызывается извне текущей единицы перевода. Таким образом, компилятор может свободно переупорядочивать параметры, при условии, что он также переупорядочивает аргументы на каждом сайте вызовов.

И все же, зачем ему это делать? Общий ответ: оптимизация (компилятору было удобнее передавать их в этом порядке). Подробный ответ потребует поиска в исходном коде GCC (или любого другого компилятора, который использовался для создания этого кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...