Ошибки компиляции функции sqrt для RaspberryPI2 и BeableBoneBlack с компилятором arm-none-eabi-gcc

Я новичок в этом типе кодирования, и я пытаюсь провести тест, выполняя программное обеспечение без операционной системы для процессоров Cortex-A. У меня есть опыт работы с MCU Cortex-M, и я скомпилировал код с помощью IDE, такой как ARM-Keil, и SDK от Nordic для некоторых заданий BLE. Теперь я хочу попытаться лучше понять мир Cortex-A, и я бы изучил кодирование с нуля, начиная с некоторых примеров, которые я нашел в Интернете. У меня был некоторый опыт работы с freeRTOS с Cortex-M, поэтому я нашел в Интернете репозиторий git от какого-то хорошего парня, который портирует freeRTOS для RaspberryPI и BeableBoneBlack. С этого момента я просто объясню свою проблему для BeableBoneBlack, а для RaspberryPI она похожа.

Я использую Linux, я установил компилятор gcc-arm-none-eabi, поэтому я клонировал BeagleBone Black с репозиторием freeRTOS по этой ссылке.

Я обычно использую VS код для написания кода, так что в интегрированном терминале, когда я запускаю команду грим все это работает, и мой ВВВ правильно мигает. Итак, теперь я хотел бы улучшить свой код, и для проведения некоторых тестов я хотел бы использовать rand()функция из stdlib.h. К сожалению, я обнаружил несколько ошибок: undefined reference to rand. В последние месяцы, перед проведением тестов с BBB, я нашел другие репозитории для RPi2 и кое-что узнал о компоновщике компилятора arm-none-eabi, который требует добавления некоторых параметров для упорядочивания файлов библиотеки ссылок во время процесса. Из этого репо теперь у меня есть два файла: makedefs_ti и makefile. Открывая make-файл, я обнаружил в строке 26-27 часть создания файлового приложения, где вызывается компоновщик. В этих строках есть ссылки на LIB_GCC и LIB_C, которые определены в файле makedefs_ti. В строках 49-50 есть ссылки на каталог, в котором установлен компилятор (я изменил 4.7.3 на правильный, установленный на моем компьютере с Linux, то есть 9.2.1). В make-файле после -L$(LIB_C), если я добавлю параметры компоновщика, например -lc или же -lg и попробуйте перекомпилировать, у меня была ошибка вроде arm-none-eabi-ld: cannot find -lc. С некоторым пониманием из онлайн-ресурсов я изменил makedefs_ti следующим образом:

# Toolchain/library path. LIB_PATH is an exported environmental variable which
# shall point to the installation of toolchain
#
#LIB_GCC=${LIB_PATH}/lib/gcc/arm-none-eabi/4.7.3/
#LIB_C=${LIB_PATH}/arm-none-eabi/lib/
LIB_GCC= /usr/lib/gcc/arm-none-eabi/9.2.1
LIB_C= /usr/lib/arm-none-eabi/lib

и make-файл:

$(LD) -o $@.out $< -T bbb.ld -Map bbb.map $(APP_LIB) $(LDFLAGS) $(RUNTIMELIB) -L $(LPATH) \
   -L $(LIB_GCC) -lgcc -L $(LIB_C) -lc -lg

Таким образом, мой файл main.c, который вызывает rand()функция компилируется правильно. Во время другого теста я попытался скомпилировать другой код. Теперь я написал пару файлов.c и.h (я поместил их в каталог rtos, чтобы использовать тот же make-файл, который там присутствует), внутри которых есть функция, вызывающая sqrt(). Итак, вызывая функцию в main() и компилировать, даже если я включаю везде <math.h> у меня ошибка:

undefined reference to `sqrt'

и очевидно, что компиляция останавливается. Начиная с этого, я попытался добавить в компоновщик еще один параметр, поэтому я изменил make-файл следующим образом:

$(LD) -o $@.out $< -T bbb.ld -Map bbb.map $(APP_LIB) $(LDFLAGS) $(RUNTIMELIB) -L $(LPATH) \
   -L $(LIB_GCC) -lgcc -L $(LIB_C) -lc -lg -lm

и у меня появляются другие ошибки, которые я не могу решить каким-либо образом:

arm-none-eabi-ld: /usr/lib/arm-none-eabi/lib/libm.a(lib_a-w_sqrt.o): in function `sqrt':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/math/../../../../../newlib/libm/math/w_sqrt.c:62: undefined reference to `__aeabi_dcmpun'
arm-none-eabi-ld: /build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/math/../../../../../newlib/libm/math/w_sqrt.c:63: undefined reference to `__aeabi_dcmplt'
arm-none-eabi-ld: /build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/math/../../../../../newlib/libm/math/w_sqrt.c:64: undefined reference to `__errno'
arm-none-eabi-ld: /build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/math/../../../../../newlib/libm/math/w_sqrt.c:65: undefined reference to `__aeabi_ddiv'
arm-none-eabi-ld: /usr/lib/arm-none-eabi/lib/libm.a(lib_a-e_sqrt.o): in function `__ieee754_sqrt':
/build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/machine/arm/../../../../../../newlib/libm/machine/arm/../../math/e_sqrt.c:110: undefined reference to `__aeabi_dmul'
arm-none-eabi-ld: /build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/machine/arm/../../../../../../newlib/libm/machine/arm/../../math/e_sqrt.c:110: undefined reference to `__aeabi_dadd'
arm-none-eabi-ld: /build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/machine/arm/../../../../../../newlib/libm/machine/arm/../../math/e_sqrt.c:117: undefined reference to `__aeabi_dsub'
arm-none-eabi-ld: /build/newlib-CVVEyx/newlib-3.3.0/build/arm-none-eabi/newlib/libm/machine/arm/../../../../../../newlib/libm/machine/arm/../../math/e_sqrt.c:117: undefined reference to `__aeabi_ddiv'
make: *** [makefile:26: app] Errore 1

Замечу, что, назвав sqrt() в основном работает правильно, проблема возникает, когда я вызываю sqrt()в другом файле.c. Вместо этого rand() функция в дополнительном файле.c работает правильно.

Я не знаю, как исправить эти ошибки, кто-нибудь может мне помочь?

В другой раз я попробовал написать тот же код в проекте Code Composer Studio, и он сработал (с теми же функциями, которые вызывают sqrt и rand в дополнительном файле.c. В чем разница?

Мне очень жаль, если это длинное объяснение, но я не нашел другого способа объяснить свою ситуацию.

Заранее большое спасибо.

Залп

1 ответ

Start .s

.globl _start
_start:
    ;@ enable fpu
    mrc p15, 0, r0, c1, c0, 2
    orr r0,r0,#0x300000 ;@ single precision
    orr r0,r0,#0xC00000 ;@ double precision
    mcr p15, 0, r0, c1, c0, 2
    mov r0,#0x40000000
    fmxr fpexc,r0

    mov sp,#0x8000
    bl notmain
hang: b hang

notmain.c

double notmain ( double a, double b )
{
    return(a+b);
}

(не настоящее приложение для металлического корпуса, созданное на его основе)

строить для жесткого плавания

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mhard-float -mfpu=vfp -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

аппаратный поплавок используется

00008024 <notmain>:
    8024:   ee300b01    vadd.f64    d0, d0, d1
    8028:   e12fff1e    bx  lr

построить для мягкого плавания

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf
arm-none-eabi-ld: notmain.o: in function `notmain':
notmain.c:(.text+0x4): undefined reference to `__aeabi_dadd'
Makefile:33: recipe for target 'notmain.elf' failed
make: *** [notmain.elf] Error 1

Ему нужен gcclib.

Использование gcc в качестве компоновщика (я знаю, насколько это ужасно).

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf -lgcc
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

...

00008024 <notmain>:
    8024:   e92d4010    push    {r4, lr}
    8028:   eb000003    bl  803c <__adddf3>
    802c:   e8bd8010    pop {r4, pc}

00008030 <__aeabi_drsub>:
    8030:   e2211102    eor r1, r1, #-2147483648    ; 0x80000000
    8034:   ea000000    b   803c <__adddf3>

00008038 <__aeabi_dsub>:
    8038:   e2233102    eor r3, r3, #-2147483648    ; 0x80000000

0000803c <__adddf3>:
    803c:   e92d4030    push    {r4, r5, lr}

gcc передает их ld.

[0][/opt/gnuarm/lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/bin/ld]
[1][-plugin]
[2][/opt/gnuarm/libexec/gcc/arm-none-eabi/10.2.0/liblto_plugin.so]
[3][-plugin-opt=/opt/gnuarm/libexec/gcc/arm-none-eabi/10.2.0/lto-wrapper]
[4][-plugin-opt=-fresolution=/tmp/ccRiWZtk.res]
[5][-X]
[6][-o]
[7][notmain.elf]
[8][-L/opt/gnuarm/lib/gcc/arm-none-eabi/10.2.0]
[9][-L/opt/gnuarm/lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib]
[10][start.o]
[11][notmain.o]
[12][-lgcc]
[13][-T]
[14][memmap]

find | grep libgcc
./lib/gcc/arm-none-eabi/10.2.0/libgcc.a
./lib/gcc/arm-none-eabi/10.2.0/thumb/libgcc.a
./lib/gcc/arm-none-eabi/10.2.0/thumb/autofp/v7/fpu/libgcc.a
./lib/gcc/arm-none-eabi/10.2.0/arm/autofp/v5te/fpu/libgcc.a

Итак, чтобы использовать ld, тогда

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf -L/opt/gnuarm/lib/gcc/arm-none-eabi/10.2.0/ -lgcc
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

Почему сейчас используется addf3? не знать.

00008024 <notmain>:
    8024:   e92d4010    push    {r4, lr}
    8028:   eb000003    bl  803c <__adddf3>
    802c:   e8bd8010    pop {r4, pc}

00008030 <__aeabi_drsub>:
    8030:   e2211102    eor r1, r1, #-2147483648    ; 0x80000000
    8034:   ea000000    b   803c <__adddf3>

00008038 <__aeabi_dsub>:
    8038:   e2233102    eor r3, r3, #-2147483648    ; 0x80000000

0000803c <__adddf3>:
    803c:   e92d4030    push    {r4, r5, lr}
    8040:   e1a04081    lsl r4, r1, #1
    8044:   e1a05083    lsl r5, r3, #1

Вот как вы справляетесь с материалом aeabi, вам нужно либо использовать hard float, либо указать путь к gcclib, либо просто добавить его в строку

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf /opt/gnuarm/lib/gcc/arm-none-eabi/10.2.0/libgcc.a
#arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf -lgcc
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

Теперь sqrt() - это вещь библиотеки C, а не библиотека gcc, поэтому вам нужна библиотека C (похоже, вы пытаетесь использовать newlib), и вам нужно построить библиотеку C, чтобы она соответствовала gcc, поэтому вам нужно построить ее жестко или soft float и необходимо включить правильную библиотеку. Кого у меня нет... ну....

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf /home/so/gcc-arm-none-eabi-9-2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/libgcc.a
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

так

double sqrt(double x);
double notmain ( double a )
{
    return(sqrt(a));
}

выглядит знакомо

arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf /home/so/gcc-arm-none-eabi-9-2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/libgcc.a /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/libm.a
arm-none-eabi-ld: /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/libm.a(lib_a-w_sqrt.o): in function `sqrt':
w_sqrt.c:(.text.sqrt+0x34): undefined reference to `__aeabi_dcmpun'
arm-none-eabi-ld: w_sqrt.c:(.text.sqrt+0x6c): undefined reference to `__aeabi_dcmplt'
arm-none-eabi-ld: w_sqrt.c:(.text.sqrt+0xc4): undefined reference to `__aeabi_ddiv'
arm-none-eabi-ld: w_sqrt.c:(.text.sqrt+0xd8): undefined reference to `__errno'
arm-none-eabi-ld: w_sqrt.c:(.text.sqrt+0x120): undefined reference to `__errno'
arm-none-eabi-ld: /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/libm.a(lib_a-e_sqrt.o): in function `__ieee754_sqrt':
e_sqrt.c:(.text.__ieee754_sqrt+0x200): undefined reference to `__aeabi_dmul'
arm-none-eabi-ld: e_sqrt.c:(.text.__ieee754_sqrt+0x20c): undefined reference to `__aeabi_dadd'
arm-none-eabi-ld: e_sqrt.c:(.text.__ieee754_sqrt+0x22c): undefined reference to `__aeabi_dsub'
arm-none-eabi-ld: e_sqrt.c:(.text.__ieee754_sqrt+0x238): undefined reference to `__aeabi_ddiv'
Makefile:33: recipe for target 'notmain.elf' failed
make: *** [notmain.elf] Error 1

находить

./arm-none-eabi/lib/libm.a
./arm-none-eabi/lib/thumb/v7e-m/nofp/libm.a
./arm-none-eabi/lib/thumb/v6-m/nofp/libm.a
./arm-none-eabi/lib/thumb/v8-m.base/nofp/libm.a
./arm-none-eabi/lib/thumb/v7/nofp/libm.a
./arm-none-eabi/lib/thumb/v8-m.main+dp/hard/libm.a
./arm-none-eabi/lib/thumb/v8-m.main+dp/softfp/libm.a
./arm-none-eabi/lib/thumb/v7e-m+dp/hard/libm.a
./arm-none-eabi/lib/thumb/v7e-m+dp/softfp/libm.a
./arm-none-eabi/lib/thumb/v7-r+fp.sp/hard/libm.a
./arm-none-eabi/lib/thumb/v7-r+fp.sp/softfp/libm.a
./arm-none-eabi/lib/thumb/v7e-m+fp/hard/libm.a
./arm-none-eabi/lib/thumb/v7e-m+fp/softfp/libm.a
./arm-none-eabi/lib/thumb/v8-m.main+fp/hard/libm.a
./arm-none-eabi/lib/thumb/v8-m.main+fp/softfp/libm.a
./arm-none-eabi/lib/thumb/v7-m/nofp/libm.a
./arm-none-eabi/lib/thumb/nofp/libm.a
./arm-none-eabi/lib/thumb/v7+fp/hard/libm.a
./arm-none-eabi/lib/thumb/v7+fp/softfp/libm.a
./arm-none-eabi/lib/thumb/v8-m.main/nofp/libm.a
./arm-none-eabi/lib/arm/v5te/hard/libm.a
./arm-none-eabi/lib/arm/v5te/softfp/libm.a

armv5te должен работать на armv6

arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf /home/so/gcc-arm-none-eabi-9-2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/libgcc.a /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/arm/v5te/softfp/libm.a
arm-none-eabi-ld: /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/arm/v5te/softfp/libm.a(lib_a-w_sqrt.o): in function `sqrt':
w_sqrt.c:(.text.sqrt+0x94): undefined reference to `__errno'
arm-none-eabi-ld: w_sqrt.c:(.text.sqrt+0xdc): undefined reference to `__errno'
Makefile:33: recipe for target 'notmain.elf' failed
make: *** [notmain.elf] Error 1

errno - глобальная переменная. что библиотека C, вероятно, хочет использовать для мягкого поплавка.

int __errno;
double sqrt(double x);
double notmain ( double a )
{
    return(sqrt(a));
}

и теперь инструмент доволен

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf /home/so/gcc-arm-none-eabi-9-2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/libgcc.a /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/arm/v5te/softfp/libm.a
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

но это жесткий поплавок, а не мягкий.

00008024 <notmain>:
    8024:   eaffffff    b   8028 <sqrt>

00008028 <sqrt>:
    8028:   e52de004    push    {lr}        ; (str lr, [sp, #-4]!)
    802c:   ed2d8b02    vpush   {d8}
    8030:   e1a02000    mov r2, r0
    8034:   e1a03001    mov r3, r1
    8038:   e24dd02c    sub sp, sp, #44 ; 0x2c
    803c:   ec432b18    vmov    d8, r2, r3
    8040:   eb000038    bl  8128 <__ieee754_sqrt>
    8044:   e59f30d4    ldr r3, [pc, #212]  ; 8120 <sqrt+0xf8>
    8048:   eeb48b48    vcmp.f64    d8, d8
    804c:   e1d3c0d0    ldrsb   ip, [r3]
    8050:   eef1fa10    vmrs    APSR_nzcv, fpscr

Вы получаете представление о том, какой путь следует предпринять для решения этой проблемы. Вам нужна правильно подобранная / собранная библиотека, и вам нужно ее связать. Кейл и другие просто делают это за вас в цепочке инструментов, сопоставляя вещи в зависимости от проекта. И / или библиотека C, интегрированная с набором инструментов.

Строительство для жесткого плавания

arm-none-eabi-as --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6 -mfpu=vfp start.s -o start.o
arm-none-eabi-gcc -Wall -O2 -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mhard-float -mfpu=vfp -c notmain.c -o notmain.o
arm-none-eabi-ld -nostdlib -nostartfiles start.o notmain.o -T memmap -o notmain.elf /home/so/gcc-arm-none-eabi-9-2019-q4-major/lib/gcc/arm-none-eabi/9.2.1/libgcc.a /home/so/gcc-arm-none-eabi-9-2019-q4-major/arm-none-eabi/lib/arm/v5te/hard/libm.a
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy --srec-forceS3 notmain.elf -O srec notmain.srec
arm-none-eabi-objcopy notmain.elf -O binary kernel.img

инструмент доволен.

00008024 <notmain>:
    8024:   eaffffff    b   8028 <sqrt>

00008028 <sqrt>:
    8028:   e52de004    push    {lr}        ; (str lr, [sp, #-4]!)
    802c:   ed2d8b02    vpush   {d8}
    8030:   eeb08b40    vmov.f64    d8, d0
    8034:   e24dd02c    sub sp, sp, #44 ; 0x2c
    8038:   eb000038    bl  8120 <__ieee754_sqrt>
    803c:   eeb48b48    vcmp.f64    d8, d8
    8040:   e59f30d0    ldr r3, [pc, #208]  ; 8118 <sqrt+0xf0>
    8044:   e1d310d0    ldrsb   

Придется сделать это реальным приложением, основные вызовы другой функции, в которой есть вызов sqrt. Затем запустите его на оборудовании и / или изучите эти инструкции. Или еще лучше получить реализацию sqrt из библиотеки C и встроить ее в проект так, чтобы она соответствовала цели и наборам инструкций. (та же история с вызовами libgcc по мере необходимости, протестируйте их или создайте).

Другие вопросы по тегам