Как заставить gcc использовать пользовательские реализации функций, реализованных в newlibc? - PullRequest
5 голосов
/ 26 марта 2012

Я работаю над встроенным программным обеспечением для микроконтроллера ARM (SAM7) и использую набор инструментов Yagarto.

Мой код в настоящее время ссылается на libc.a. Однако я бы хотел использовать пользовательскую реализацию встроенной функции memcpy , которая уже есть в моем коде.

Я пытался использовать -fno-builtin и / или -fno-builtin-memcpy , как указано в Руководстве по GCC , но компоновщик по-прежнему жалуется на следующее предупреждение:

contiki-crazy-horse.a(flashd_efc.o): In function `memcpy':
C:\Users\Melvin\GitRepo\projects\Amatis_Project\SAM7_Contiki\examples\er-rest-example/../../cpu/arm//at91sam7s-x/./flashd_efc.c:669: multiple definition of `memcpy'
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-memcpy.o):C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\string/../../../../../newlib-1.19.0/newlib/libc/string/memcpy.c:78: first defined here
collect2: ld returned 1 exit status
make: *** [rest-server-example-nosyms.crazy-horse] Error 1
../../cpu/arm/at91sam7s-x/Makefile.at91sam7s-x:181: recipe for target `rest-server-example-nosyms.crazy-horse' failed

Как правильно использовать пользовательские реализации некоторых встроенных функций gcc?

Редактировать 1: Добавление команды связывания, которую я использую. В приведенном ниже коде Porject.a - архивный файл, созданный со всеми объектными файлами проекта.

CC       = arm-none-eabi-gcc
CFLAGSNO = -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) -I$(CONTIKI_CPU)/loader \
       -I$(CONTIKI_CPU)/dbg-io \
           -I$(CONTIKI)/platform/$(TARGET) \
           ${addprefix -I,$(APPDIRS)} \
           -DWITH_UIP -DWITH_ASCII -DMCK=$(MCK) \
           -Wall $(ARCH_FLAGS) -g -D SUBTARGET=$(SUBTARGET)

CFLAGS  += $(CFLAGSNO) -O -DRUN_AS_SYSTEM -DROM_RUN  -ffunction-sections

LDFLAGS += -L $(CONTIKI_CPU) --verbose -T $(LINKERSCRIPT) -nostartfiles  -Wl,-Map,$(TARGET).map

$(CC) $(LDFLAGS) $(CFLAGS) -nostartfiles -o project.elf -lc Project.a

1 Ответ

3 голосов
/ 26 марта 2012

Если он находит memcpy() в libc.a, то он не конфликтует ни с каким «встроенным», а скорее с реализацией newlib. Вам также может потребоваться указать параметр -nostdlibs и явно связать libc.a и libm.a при необходимости.

Файлы объектов (.o) связываются до поиска файлов библиотечных архивов (.a), поэтому, если символ разрешен объектным файлом, он не будет найден в архивах. Если вы разместите переопределения в библиотеке статических ссылок, то вы просто перечисляете ее перед стандартной библиотекой (или любыми другими библиотеками, использующими стандартную библиотеку) в командной строке компоновщика.

[Добавлено] Изначально следующее было «комментарием», но, вероятно, должно быть в ответе; это в ответ на «Изменить 1» в вопросе, и комментарий ниже о порядке ссылки:

Изменить -nostartfiles -o project.elf -lc Project.a на -nostdlib -o project.elf -start-group Project.a -lc -end-group. Переключатель -nostdlib отключает связывание по умолчанию как файлов запуска (т. Е. -nostartfiles), так и стандартных библиотек. Группировка библиотек приводит к итеративному поиску библиотек в группе до тех пор, пока не будут разрешены дополнительные символы, что позволяет разрешать неупорядоченные и циклические зависимости, подобные вашей. Альтернативная форма для групповых ключей: -( Project.a -lc -).

...