Получение GCC для компиляции без вставки вызова в memcpy - PullRequest
11 голосов
/ 20 июня 2011

В настоящее время я использую GCC 4.5.3, скомпилированный для PowerPC 440, и компилирую некоторый код, который не требует libc. У меня нет прямых вызовов memcpy (), но компилятор, кажется, вставляет один во время сборки.

Существуют опции компоновщика, такие как -nostdlib, -nostartfiles, -nodefaultlibs, но я не могу их использовать, так как не выполняю фазу линковки. Я только компилирую. С чем-то вроде этого:

$ powerpc-440-eabi-gcc -O2 -g -c -o output.o input.c

Если я проверяю output.o с nm, я вижу ссылку на memcpy:

$ powerpc-440-eabi-nm output.o | grep memcpy
     U memcpy
$ 

Страница руководства GCC разъясняет, как удалять вызовы memcpy и другие вызовы libc с помощью компоновщика, но я не хочу, чтобы компилятор вставлял их в первую очередь, поскольку я использую совершенно другой компоновщик не для GNU, и он не знает о libc).

Спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 4 ]

6 голосов
/ 20 июня 2011

Вам нужно отключить эту оптимизацию с помощью -fno-builtin. У меня была эта проблема однажды, когда я пытался скомпилировать memcpy для библиотеки C. Это называло себя. Упс!

5 голосов
/ 24 февраля 2012

При некоторых обстоятельствах Gcc отправляет вызов memcpy, например, если вы копируете структуру.Нет способа изменить поведение GCC, но вы можете попытаться избежать этого, изменив свой код, чтобы избежать такого копирования.Лучше всего посмотреть на сборку, чтобы выяснить, почему gcc выпустил memcpy, и попытаться обойти ее.Это будет раздражать, так как вам нужно понять, как работает gcc.

Извлечение из http://gcc.gnu.org/onlinedocs/gcc/Standards.html:

Большинство подпрограмм поддержки компилятора, используемых GCC, присутствуют в libgcc, ноЕсть несколько исключений.GCC требует, чтобы автономная среда предоставляла memcpy, memmove, memset и memcmp.Наконец, если используется __builtin_trap, а цель не реализует шаблон прерываний, то GCC отправит вызов для отмены.

3 голосов
/ 20 ноября 2015

Нет необходимости -fno-builtins или -ffreestanding, так как они без необходимости отключат многие важные оптимизации

Это на самом деле "оптимизировано" шаблонами дерева петель-распределений gcc, поэтому отключить нежелательныеповедение, сохраняя полезные встроенные возможности, вы можете просто использовать:

-fno-tree-loop-distribute-patterns

Musl-libc использует этот флаг для своей сборки и имеет следующее примечание в своихскрипт настройки (я просмотрел исходный код и не нашел никаких макросов, поэтому этого должно быть достаточно )

# Проверьте параметры, которые могут потребоваться для предотвращения компиляции
# генерирует самореферентные версии memcpy ,, memmove, memcmp,
# и memset.На самом деле, мы должны добавить проверку, чтобы определить, достаточна ли эта опция
#, и, если нет, добавить макрос для искажения этих
# функций с помощью volatile ...
# tryflag CFLAGS_MEMOPS -fno-tree-loop-distribate-pattern

Вы также можете добавить это как атрибут для отдельных функций в gcc, используя его атрибут optimize, чтобы другие функции могли извлечь выгоду из вызова mem*()

3 голосов
/ 20 июня 2011

Вы также можете сделать свой двоичный файл «автономным»:

Стандарт ISO C определяет (в разделе 4) два класса соответствующей реализации.Соответствующая размещенная реализация поддерживает весь стандарт [...];соответствующая отдельно стоящая реализация требуется только для предоставления определенных библиотечных средств: тех, которые находятся в,, и;начиная с AMD1, также и в;и в C99, также в и.[...].

Стандарт также определяет две среды для программ: автономную среду, требуемую для всех реализаций и которая может не иметь библиотечных средств, кроме тех, которые требуются для автономных реализаций, где обработка запуска программыЗавершение определяется реализацией и размещенной средой, которая не требуется, в которой предоставляются все возможности библиотеки и запуск осуществляется через функцию int main (void) или int main (int, char * []).

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

(абзац добавлен мной)

Подробнее здесь .И соответствующий параметр / s gcc (ключевые слова -freestanding или -fno-builtin) можно найти здесь .

...