Обе утилиты поддерживают похожий набор опций.
-Сили --demangle |
Только для ltrace. Декодирует (или расшифровывает) имена библиотечных символов в читабельные имена. В результате убираются начальные символы подчеркивания (многие функции glibcимеют внутренние имена с начальными символами подчеркивания) и функции библиотеки С++ становятся более читабельными (С++ шифрует информацию о типе в символьные имена). |
-е |
Только для strace. Указывает подмножество вызовов, которые нужно вывести. Существует множество возможных спецификаций, описанных на man-странице strace; самой распространенной спецификацией является -е trace=file, которая трассирует только системные вызовы, связанные с файловым вводом-выводом и обработкой файлов. |
-f |
Пытается «следовать вызову fork()», по возможности трассируя дочерние процессы. Обратите внимание, что дочерний процесс может некоторое время работать без трассировки до тех пор, пока straceили ltraceсможет подключиться к нему и трассировать его действия. |
-о имя_файла |
Вместо вывода на стандартное устройство вывода выводит в файл имя файла. |
-р pid |
Вместо запуска нового экземпляра программы подключается к процессу с идентификатором pid . |
-S |
Только для ltrace. Отслеживает системные и библиотечные вызовы. |
-v |
Только для strace. Не сокращает большие структуры в системных вызовах вроде семейства вызовов stat(), termiosи так далее. |
На man-страницах утилит можно найти описание этих и других опций, здесь не упомянутых.
Глава 5
Опции и расширения gcc
Для правильного использования gcc, стандартного компилятора С для Linux, необходимо изучить опции командной строки. Кроме того, gccрасширяет язык С. Даже если вы намерены писать исходный код, придерживаясь ANSI-стандарта этого языка, некоторые расширения gccпросто необходимо знать для понимания заголовочных файлов Linux.
Большинство опций командной строки такие же, как применяемые в компиляторах С. Для некоторых опций никаких стандартов не предусмотрено. В этой главе мы охватим наиболее важные опции, которые используются в повседневном программировании.
Стремление соблюсти ISO-стандарт С весьма полезно, но в связи с тем, что С является низкоуровневым языком, встречаются ситуации, когда стандартные средства недостаточно выразительны. Существуют две области, в которых широко применяются расширения gcc: взаимодействие с ассемблерным кодом (эти вопросы раскрываются по адресу http://www.delorie.com/djgpp/doc/brennan/) и сборка совместно используемых библиотек (см. главу 8). Поскольку заголовочные файлы являются частью совместно используемых библиотек, некоторые расширения проявляются также в системных заголовочных файлах.
Конечно, существует еще множество расширений, полезных в любом другом виде программирования, которые могут очень даже помочь при кодировании. Дополнительную информацию по этим расширениям можно найти в документации gccв формате Texinfo.
gccпринимает множество командных опций. К счастью, набор опций, о которых действительно нужно иметь представление, не так велик, и в этой главе мы его рассмотрим.
Большинство опций совпадают или подобны опциям других компиляторов, gccвключает в себя огромную документацию по своим опциям, доступную через info gcc ( man gccтакже выдает эту информацию, однако man-страницы не обновляются настолько часто, как документация в формате Texinfo).
-о имя_файла |
Указывает имя выходного файла. Обычно в этом нет необходимости, если осуществляется компиляция в объектный файл, то есть по умолчанию происходит подстановка имя_файла .сна имя_файла .о. Однако если вы создаете исполняемый файл, по умолчанию (по историческим причинам) он создается под именем а.out. Это также полезно в случае, когда требуется поместить выходной файл в другой каталог. |
-с |
Компилирует без компоновки исходный файл, указанный для командной строки. В результате для каждого исходного файла создается объектный файл. При использовании makeкомпилятор gccобычно вызывается для каждого объектного файла; таким образом, в случае возникновения ошибки легче обнаружить, какой файл не смог скомпилироваться. Однако если вы вручную набираете команды, часто в одном вызове gccуказывается множество файлов. В случае, если при задании множества файлов в командной строке может возникнуть неоднозначность, лучше указать только один файл. Например, вместо gcc -с -о а.о а.с b.симеет смысл применить gcc -с -o a.o b.c. |
-D foo |
Определяет препроцессорные макросы в командной строке. Возможно, потребуется отменить символы, трактуемые оболочкой как специальные. Например, при определении строки следует избегать употребления ограничивающих строки символов ". Вот два наиболее употребляемых способа: '-Dfoo="bar"'и -Dfoo=\"bar\". Первый способ работает намного лучше, если в строке присутствуют пробелы, поскольку оболочка рассматривает пробелы особым образом. |
-I каталог |
Добавляет каталог в список каталогов, в которых производится поиск включаемых файлов. |
-L каталог |
Добавляет каталог в список каталогов, в которых производится поиск библиотек, gccбудет отдавать предпочтение совместно используемым библиотекам, а не статическим, если только не задано обратное. |
-l foo |
Выполняет компоновку с библиотекой lib foo . Если не указано обратное, gccотдает предпочтение компоновке с совместно используемыми библиотеками ( lib foo .so), а не статическими ( lib foo .a). Компоновщик производит поиск функций во всех перечисленных библиотеках в том порядке, в котором они перечислены. Поиск завершается тогда, когда будут найдены все искомые функции. |
-static |
Выполняет компоновку с только статическими библиотеками. См. главу 8. |
-g, -ggdb |
Включает отладочную информацию. Опция -gзаставляет gccвключить стандартную отладочную информацию. Опция -ggdbуказывает на необходимость включения огромного количества информации, которую в силах понять лишь отладчик gdb. |
|
Если дисковое пространство ограничено или вы хотите пожертвовать некоторой функциональностью ради скорости компоновки, следует использовать -g. В этом случае, возможно, придется воспользоваться другим отладчиком, а не gdb. Для максимально полной отладки необходимо указывать -ggdb. В этом случае gccподготовит максимально подробную информацию для gdb. Следует отметить, что в отличие от большинства компиляторов, gccпомещает некоторую отладочную информацию в оптимизированный код. Однако трассировка в отладчике оптимизированного кода может быть сопряжена со сложностями, так как во время выполнения могут происходить прыжки и пропуски фрагментов кода, которые, как ожидалось, должны были выполняться. Тем не менее, при этом можно получить хорошее представление о том, как оптимизирующие компиляторы изменяют способ выполнения кода. |
-O, -O n |
Заставляет gcc оптимизировать код. По умолчанию, gccвыполняет небольшой объем оптимизации; при указании числа ( n ) осуществляется оптимизация на определенном уровне. Наиболее распространенный уровень оптимизации — 2; в настоящее время в стандартной версии gcc самым высоким уровнем оптимизации является 3. Мы рекомендуем использовать -O2или -O3; -O3может увеличить размер приложения, так что если это имеет значение, попробуйте оба варианта. Если для вашего приложения важна память и дисковое пространство, можно также использовать опцию -Os, которая делает размер кода минимальным за счет увеличения времени выполнения. gccвключает встроенные функции только тогда, когда применяется хотя бы минимальная оптимизация ( -O). |
-ansi |
Поддержка в программах на языке С всех стандартов ANSI (X3.159-1989) или их эквивалента ISO (ISO/IEC 9899:1990) (обычное называемого С89 или реже С90). Следует отметить, что это не обеспечивает полное соответствие стандарту ANSI/ISO. |
|
Опция -ansiотключает расширения gcc, которые обычно конфликтуют со стандартами ANSI/ISO. (Вследствие того, что эти расширения поддерживаются многими другими компиляторами С, на практике это не является проблемой.) Это также определяет макрос __STRICT_ANSI__(как описано далее в этой книге), который заголовочные файлы используют для поддержки среды, соответствующей ANSI/ISO. |
-pedantic |
Выводит все предупреждения и сообщения об ошибках, требуемые для ANSI/ISO-стандарта языка С. Это не обеспечивает полное соответствие стандарту ANSI/ISO. |
-Wall |
Включает генерацию всех предупреждений gcc, что обычно является полезным. Но таким образом не включаются опции, которые могут пригодиться в специфических случаях. Аналогичный уровень детализации будет установлен и для программы синтаксического контроля lintв отношении вашего исходного кода, gccпозволяет вручную включать и отключать каждое предупреждение компилятора. В руководстве по gccподробно описаны все предупреждения. |
Читать дальше