Мне действительно нужен libgcc? - PullRequest
15 голосов
/ 23 февраля 2012

Я использую GCC 4.6.2 в Mac OS X 10.6.Я использую опцию -static-libgcc при компиляции, в противном случае мои двоичные файлы ищут libgcc в системе, и я не уверен, что что-то более GCC 4.2 поддерживается в OS X. Это работает нормально, но зачем мне даже нужен libgcc?Я прочитал об этом, и документы GNU говорят, что он содержит «арифметические операции, которые целевой процессор не может выполнить напрямую».Как мне узнать, что это за операции?И почему они настолько сложны, что мне нужно включить эту библиотеку?Почему GCC не может просто оптимизировать код напрямую, а не прибегать к этим функциям библиотеки?Я немного запутался.Любое понимание этого будет оценено!

1 Ответ

17 голосов
/ 23 февраля 2012

Да, тебе это нужно .... наверное.Если вам это не нужно, то статическое связывание безвредно.Вы можете определить, нужно ли вам это, используя опцию -t link trace (я думаю).

Есть несколько вещей, которые вы не можете сделать в одной инструкции (обычно такие вещи, как 64-битные операции на 32-битнойархитектуры).Эти вещи могут быть выполнены, но если они используют нетривиальное количество инструкций, тогда более экономно использовать их все в одном месте.

Когда вы отключаете оптимизацию с помощью -O0 (это фактически значение по умолчанию)в любом случае) тогда GCC почти всегда использует процедуры libgcc.

Когда вы включаете оптимизацию speed , тогда GCC может выбрать вставку последовательности команд непосредственно в код (если он знает, как).Вы можете обнаружить, что он не использует ни одну из версий libgcc - он, безусловно, будет использовать меньше вызовов libgcc.

Когда вы включаете оптимизацию size , тогда GCC может предпочесть вызов функции или не- это зависит от того, что разработчики GCC считают лучшим соотношением скорости / размера в каждом конкретном случае.Обратите внимание, что даже когда вы указываете оптимизировать скорость, компилятор может решить, что некоторые функции вряд ли будут использоваться, и оптимизировать их по размеру - даже больше, если вы используете PGO.

По сути, вы можете думать об этом так же, как memcpy или функции математической библиотеки: компилятор встроит функции, которые он считает полезными, и вызовет библиотечные функции в противном случае.Компилятор может «встроить» стандартные функции и функцию libgcc, не глядя на определение библиотеки, конечно - он просто «знает», что они делают.

Использование статической или динамической libgcc - интересный компромисс.С одной стороны, динамическая (разделяемая) библиотека будет использовать меньше памяти во всей вашей системе, и, скорее всего, будет кэширована и т. Д. С другой стороны, статическая libgcc имеет меньшие накладные расходы на вызов.

Но самое главное - это совместимость.Очевидно, что библиотека libgcc должна присутствовать для запуска вашей программы, но она также должна быть совместимой версия .Вы работаете в дистрибутиве Linux со стабильной версией GCC, но в остальном статические линки безопаснее.

Надеюсь, это ответит на ваши вопросы.

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