Подтвердить что ты не робот

Мне действительно нужно libgcc?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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