linker - none - ¿Cómo puedo forzar a gcc a usar implementaciones personalizadas de las funciones implementadas de newlibc?
https launchpad net gcc arm embedded (1)
Si está encontrando memcpy()
en libc.a, entonces no está en conflicto con ningún "built-in", sino con la implementación de newlib. También puede necesitar especificar la opción -nostdlibs y vincular explícitamente libc.a y libm.a según sea necesario.
Los archivos de objetos (.o) se vinculan antes de que se busquen los archivos de los archivos de la biblioteca (.a), por lo que si un archivo de objeto resuelve un símbolo, no se buscará en los archivos. Si coloca sus anulaciones en una biblioteca de enlaces estáticos, entonces simplemente la lista antes que la biblioteca estándar (o cualquier otra biblioteca que use la biblioteca estándar) en la línea de comando del enlazador.
[Agregado] Lo siguiente fue originalmente un "comentario", pero probablemente debería estar en la respuesta; es en respuesta a "Editar 1" en la pregunta y al siguiente comentario sobre el orden del enlace:
Cambia -nostartfiles -o project.elf -lc Project.a
a -nostdlib -o project.elf -start-group Project.a -lc -end-group
. El cambio -nostdlib
deshabilita el enlace predeterminado de ambos archivos de inicio (es decir, -nostartfiles
) y bibliotecas estándar. La agrupación de la biblioteca hace que las bibliotecas del grupo se busquen de manera iterativa hasta que no se puedan resolver más símbolos, lo que permite que se resuelvan las dependencias circulares fuera de servicio y circulares. Una forma alternativa para los interruptores de agrupamiento es -( Project.a -lc -)
.
Estoy trabajando en un software integrado para un microcontrolador ARM (SAM7) y el uso de Yagarto toolchain.
Mi código actualmente vincula libc.a. Sin embargo, me gustaría utilizar una implementación personalizada de la función incorporada memcpy que mi código ya tiene.
He intentado usar -fno-builtin y / o -fno-builtin-memcpy como se especifica en el Manual de GCC pero el enlazador todavía se queja de la siguiente advertencia:
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
¿Cuál es la forma correcta de usar implementaciones personalizadas de ciertas funciones incorporadas de gcc?
Editar 1: Agregar el comando de enlace que estoy usando. En el código a continuación, Porject.a es un archivo de almacenamiento creado con todos los archivos de objeto del proyecto.
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