Почему g ++ генерирует несколько (слабых) похожих символов? - PullRequest
3 голосов
/ 06 февраля 2010

Я смотрю на выходе нм -C

0804a86a W ForkMessageHandler::ForkMessageHandler()
0804a86a W ForkMessageHandler::ForkMessageHandler()
0804a6fa T ForkMessageHandler::~ForkMessageHandler()
0804a698 T ForkMessageHandler::~ForkMessageHandler()
0804a698 T ForkMessageHandler::~ForkMessageHandler()
0804a800 W MultiMessageHandler::MultiMessageHandler()
0804a800 W MultiMessageHandler::MultiMessageHandler()
0804a84c W MultiMessageHandler::~MultiMessageHandler()
0804a81c W MultiMessageHandler::~MultiMessageHandler()
0804a81c W MultiMessageHandler::~MultiMessageHandler()

Почему g ++ генерирует много похожих символов и для чего нужны слабые символы?

Редактировать: это из окончательного исполняемого файла, а не .o файла. ForkMessageHandler определен в файле .cpp, никто не включает заголовок для него, но некоторые включают заголовки для его базового класса.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

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

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

0 голосов
/ 06 февраля 2010

Насколько я понимаю, GCC генерирует inline функции, используя слабые символы, поэтому при любых вызовах функции, которые не являются встроенными, он может связать ее с любым из определений и выбросить остальные.

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