__do_global_dtors_aux и __do_global_ctors_aux - PullRequest
8 голосов
/ 25 июня 2011

Я разобрал простую программу, написанную на C ++, и есть эти две имена функций.Я предполагаю, что ctor означает конструктор, а dtor означает деструктор, а слово global может означать, что они создают и уничтожают глобальные объекты.Я не могу угадать имя aux.Что делают эти две функции?

Ответы [ 2 ]

18 голосов
/ 25 июня 2011

Адреса конструкторов и деструкторов статических объектов каждый хранится в отдельном разделе в исполняемом файле ELF .для конструкторов есть секция с именем .CTORS , а для деструкторов - секция .DTORS .

компилятор создает две вспомогательные функции __ do_global_ctors_aux и __ do_global_dtors_aux для вызова конструкторов и деструкторов этих статических объектов соответственно.

__ do_global_ctorsФункция просто выполняет обход раздела .CTORS , тогда как __ do_global_dtors_aux выполняет ту же работу только для раздела .DTORS , который содержит указанную программу.функции деструкторов.

9 голосов
/ 25 июня 2011

Это вспомогательные функции, добавленные компилятором для создания и уничтожения статических объектов.

Например,

std::vector<int> some_global;

int main() { return 0; }

some_global должен быть где-то фактически создан (и уничтожен), и C ++гарантирует, что строительство произойдет до main.Один из способов сделать это - вызвать функцию, которая происходит до main, которая создает глобальные объекты, и другую функцию, которая происходит после main, чтобы уничтожить их.

Если вы вставили точку останова в std::vector конструктор и запустил эту программу, трассировка стека покажет вам функцию, из которой она была инициализирована.

...