Ссылка с newlib: неопределенная ссылка на memcpy - PullRequest
0 голосов
/ 16 декабря 2011

Я пытаюсь создать ручной загрузчик, и он использует newlib для обеспечения некоторых системных вызовов (например, memcpy).

Когда я бегу:

arm-elf-ld -static -L /usr/arm-elf/lib/thumb/ -lc -nostdlib -nostartfile -Map=loader.map --cref -T loader.lds --gc-sections -Ttext 0x000000 -n -o loader.elf start.o _udivsi3.o _umodsi3.o main.o util.o gpio.o spi.o flashatmel.o flashjedec.o image.o time.o clock.o led.o register.o sdram.o

Я получаю следующее:

 flashatmel.o flashjedec.o image.o time.o clock.o led.o register.o sdram.o            
 main.o: In function `TtyPutConfiguration':
/home/shawn/projects/netbridge-fx/loader/main.c:19: undefined reference to `memcpy'
main.o: In function `main':
/home/shawn/projects/netbridge-fx/loader/main.c:135: undefined reference to   `__gnu_thumb1_case_uqi'
/home/shawn/projects/netbridge-fx/loader/main.c:145: undefined reference to `__gnu_thumb1_case_uqi'
/home/shawn/projects/netbridge-fx/loader/main.c:155: undefined reference to `__gnu_thumb1_case_uqi'
/home/shawn/projects/netbridge-fx/loader/main.c:165: undefined reference to `__gnu_thumb1_case_uqi'
gpio.o: In function `GpioTest':
/home/shawn/projects/netbridge-fx/loader/gpio.c:139: undefined reference to `__gnu_thumb1_case_uqi'

Пока что я атакую ​​memcpy и надеюсь, что остальные последуют. Когда я запускаю nm /usr/arm-elf/lib/thumb/libc.a (который, я считаю, является версией libc для новой библиотеки), он показывает:

lib_a-memcpy.o:
00000010 N $d
00000000 t $t
00000001 T memcpy

Итак, это показывает, что memcpy определен в библиотеке.

Я запустил strace по команде ld, указанной выше, чтобы убедиться, что он действительно просматривает этот файл, и действительно, это так.

Что мне здесь не хватает? Почему он жалуется на неопределенный memcpy?

1 Ответ

2 голосов
/ 16 декабря 2011

Это выглядит подозрительно:

-lc -nostdlibs

Я думаю, что -nostdlibs отменяет -lc.Попробуйте напрямую связать libc.a и посмотрите, что произойдет.

Пока вы это делаете, я вижу, что вы ссылаетесь в некоторых внутренних реализациях (например, _udivsi3.o).Попробуйте связать с libgcc.a, он должен иметь определения всех необходимых вам встроенных функций.

...