2011-04-23 42 views
10

Tengo un problema con _sbrk. En una fase de enlace de compilación utilizo el comando siguiente para vincular mis objetos y obtengo una referencia no definida a _sbrk.Referencia no definida a _sbrk

arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a 

Estoy compilando para ARM926EJ-s y en modo ARM así que creo que he elegido el multilib derecha (libc.a y libgcc.a) que se encuentra en la carpeta de inicio/ziga/proyectos/cs_lite/brazo -none-eabi/lib /.

He estado buscando en internet la función _sbrk y es una especie de llamada de administración de memoria que no está incluida en las bibliotecas estándar de C, ya que depende del microprocesador. Entonces, ¿tengo que escribir la función _sbrk por mi cuenta? ¿Cómo lo hago? ¿Tienes algún ejemplo para arm926ej-s? Después de escribir esta función, intento compilarla en un archivo objeto y vincularla junto con otros objetos, bibliotecas.

Con saludos cordiales, Ziga.


que resolvieron este problema y se publicará solución a este problema, así que devolver algo a la comunidad . La función _sbrk se encuentra dentro del paquete NXP CDL para ARM. Paquete está disponible para su descarga (enlace es para todos los que no sé esto ya) aquí: http://www.lpclinux.com/Downloads/WebHome En subcarpeta CDL_v005/DEN/lpc313x/BSP/ea3131/fuente se encuentra el archivo de origen libnosys_gnu.c nombre que hay que añadir a el proyecto y compilado para objetar el archivo y luego vinculado al archivo ejecutable junto con otros objetos y bibliotecas .

Los mejores deseos y mucho éxito.

+7

en realidad debería poner esa respuesta en una _respuesta_ en lugar de editar su pregunta. Está bien responder tus propias preguntas (incluso para aceptarlas). – paxdiablo

Respuesta

3

Esto ayuda:

-mcpu = Cortex-M4 -mthumb -specs = nano.specs -specs = nosys.Ficha -mfpu = fpv4-sp-d16 -mfloat-abi = dura

Los interruptores importantes "parecen" ser:

-specs = nano.specs -specs = nosys.specs

3

El problema tiene poco que ver con _sbrk en sí mismo, sino más bien con su intento de invocar el enlazador directamente, sin pasar por el controlador del compilador. En su lugar, use el comando gcc para invocar el enlazador y la sintaxis -Wl,-linkeroptionhere para pasar opciones adicionales al enlazador.

Una posible solución, si debe invocar el vinculador usted mismo .. Intente repetir libc.a y libgcc.a por segunda vez al final de la línea de comandos. También hay alguna opción de vinculador "como grupo" que podría usar para lograr esto, pero no lo sé de inmediato.

+0

He reparado mi problema con la publicación editada. – 71GA

2

recientemente también encontré esto (otra vez). La solución más sencilla que funcionó para mí fue proporcionar/redireccionar las aplicaciones "malloc" y "gratuitas" a la disponible en el SDK en el que estaba compilando mi aplicación.

Básicamente ocurre debido a la falta de administración de la memoria al vincular. como la respuesta anterior menciona, no es que _sbrk falta específicamente aquí. brk/sbrk syscall se usa intencionalmente para la administración de heap. de ahí el _sbrk, eslabón perdido cuando se trata de aplicaciones de administración de mem.

Me di cuenta de que la adición de -lnosys (es decir, libnosys.a) también ayudó a esto en cierta medida en algunas integraciones.

Cuestiones relacionadas