2012-03-26 22 views
5

Estoy trabajando en un software integrado para un microcontrolador ARM (SAM7) y el uso de Yagarto toolchain.¿Cómo puedo forzar a gcc a usar implementaciones personalizadas de las funciones implementadas de newlibc?

Mi código enlaza actualmente libc.a. Sin embargo, me gustaría utilizar una implementación personalizada de la función integrada memcpy que mi código ya tiene.

He intentado usar -fno-orden interna y/o -fno incorporado-memcpy como se especifica en el GCC Manual pero el enlazador todavía se queja será 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 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 
+0

También incluya la línea de comando del vinculador que generó este error. – Clifford

+0

@Clifford He editado la publicación original para agregar la información que ha solicitado – maguirre

Respuesta

3

Si está encontrando memcpy() en libc.a, entonces no está en conflicto con cualquier "incorporada", sino más bien con la implementación 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 la biblioteca (.a), por lo que si un archivo 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]El siguiente fue originalmente un "comentario" pero probablemente debería estar en la respuesta; es en respuesta a "Editar 1" en la pregunta y el comentario a continuación sobre la orden de enlace:

Cambia -nostartfiles -o project.elf -lc Project.a a -nostdlib -o project.elf -start-group Project.a -lc -end-group. El interruptor -nostdlib deshabilita la vinculación predeterminada 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 agrupación es -(Project.a -lc -).

+0

@Cliford. Mi error. Tienes razón ¿Hay alguna manera de elegir qué implementación de memcpy quiero que vincule mi código? No puedo cambiar el orden de enlace entre Project.a y libc.a porque mi proyecto tiene algunas funciones stub que libc.a necesita – maguirre

+2

@ Mischief: alternativamente, separe los stubs newlib de los archivos del proyecto 'Project.a -lc stubs .a'. Usar un archivo para sus archivos de proyecto es algo inusual de hacer; puede evitar el problema por completo vinculando archivos de objeto directamente como es la norma. El código en los archivos de objeto siempre se usará con preferencia al código de la biblioteca, independientemente del orden del enlace; entonces los stubs de libc serán resueltos por cualquier código de objeto que enlace con símbolos coincidentes, y cualquier código de objeto será resuelto de otro código de objeto antes del código de biblioteca, por lo que memcpy() será anulado correctamente incluso para llamadas dentro de libc. – Clifford

+0

Estoy de acuerdo con usted en su comentario sobre tener el código en un archivo es inusual. Si/cuando lo haga, se cambiará – maguirre

Cuestiones relacionadas