Błąd kompilacji ARM, zarejestrowany VFP używany przez plik wykonywalny, a nie obiektowy

[3]}mam ten problem od kilku dni i nie mogę zrozumieć, co naprawdę się tu dzieje, ani w czym jest problem.

Mam makefile z tymi flagami:

CC = arm-linux-gnueabihf-gcc-4.6
FLAGS = -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -std=gnu99
Mam bibliotekę w ... plik, który zawiera pliki obiektowe, wszystko, co muszę zrobić, to połączyć je z moim programem wykonywalnym. Znam prototypy i takie tam, jedyne co narzeka to:
/usr/bin/ld: error: *EXECUTABLE* uses VFP register arguments, *OBJECTFILE* does not
/usr/bin/ld: failed to merge target specific data of file *OBJECTFILE*

Kiedy nie używam-mfloat-abi = softfp, dostaję kolejny błąd odnoszące się do rejestrów zmiennoprzecinkowych.

Czy ktoś ma pojęcie, co jest przyczyną tego i co mogę zrobić, aby to naprawić, na przykład tak, aby mój plik wykonywalny nie używał wirtualnych argumentów rejestru zmiennoprzecinkowego?

x@x:~/Desktop/perf_test$ make
arm-linux-gnueabihf-gcc-4.6 -c -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -std=gnu99 -mfloat-abi=softfp  perf_test.c ../baseline/util.c
arm-linux-gnueabihf-gcc-4.6 -o perf_test perf_test.o util.o  ../baseline/lib.a
/usr/bin/ld: error: perf_test uses VFP register arguments, perf_test.o does not
/usr/bin/ld: failed to merge target specific data of file perf_test.o
/usr/bin/ld: error: perf_test uses VFP register arguments, util.o does not
/usr/bin/ld: failed to merge target specific data of file util.o
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(a.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(a.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(b.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(b.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(c.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(d.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(d.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(e.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(e.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(f.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(f.o)
collect2: ld returned 1 exit status
make: *** [perf_test] Error 1
Author: M.M, 2012-03-18

10 answers

Twój docelowy triplet wskazuje, że Twój kompilator jest skonfigurowany dla hard-float ABI. Oznacza to, że biblioteka libgcc będzie również hardfp. Komunikat o błędzie wskazuje, że przynajmniej część systemu korzysta z soft-float ABI.

Jeśli kompilator ma włączoną funkcję multilib (możesz powiedzieć za pomocą -print-multi-lib), możesz użyć -mfloat-abi=softfp, ale jeśli nie, ta opcja nie pomoże Ci zbytnio: gcc chętnie wygeneruje kod softfp, ale wtedy nie będzie kompatybilnego libgcc do linkowania przeciw.

Zasadniczo, hardfp i softfp nie są kompatybilne. Musisz skonfigurować cały system w taki czy inny sposób.

EDIT: niektóre dystrybucje są lub będą "multiarch". Jeśli masz jeden z nich, to możliwe jest zainstalowanie obu ABIs naraz, ale odbywa się to przez podwojenie wszystkiego - problemy ze zgodnością nadal istnieją.

 41
Author: ams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-17 21:36:57

Znalazłem na ARM hardfloat system, gdzie binutils glibc i gcc zostały skompilowane, użycie gcc daje ten sam błąd.

Jest to rozwiązane przez eksport -mfloat-abi=hard do flags, a następnie GCC kompiluje się bez błędów.

 14
Author: 白い熊,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 11:28:02

Również błąd można rozwiązać dodając kilka znaczników, takich jak -marm -mthumb-interwork. Pomogło mi uniknąć tego samego błędu.

 4
Author: AVG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-29 06:44:37

To jest zgadywanie, ale może być konieczne dostarczenie niektórych lub wszystkich przełączników zmiennoprzecinkowych dla etapu łącza.

 3
Author: blueshift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-17 21:36:00

Użyj tych samych opcji kompilatora również do łączenia.

przykład:

gcc  -mfloat-abi=hard fpu=neon -c -o test.cpp test.o
gcc  -mfloat-abi=hard fpu=neon -c test1.cpp test1.o
gcc test.o test1.o mfloat-abi=hard fpu=neon HardTest
 2
Author: raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-23 18:58:44

W moim przypadku CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft pomógł. Jak widać, użyłem go do mojego stm32f407.

 2
Author: user4912846,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 15:56:44

Napotkałem problem używając atoli dla ARM na STM32F4 (chyba dotyczy to wszystkich STM32 z FPU).

Użycie zmiennoprzecinkowej zmiennej SW nie zadziałało dobrze dla mnie (kompilowanie poprawne).

Gdy STM32cubeMX generuje kod dla TrueStudio (Atollic), nie ustawia jednostki FPU w Ustawieniach kompilacji C / C++ (nie jest pewien generowanego kodu dla innych IDE).

Ustaw FPU w "Target" dla (w Ustawieniach budowania właściwości projektu):

  • asembler
  • C Kompilator
  • C Linker

Następnie masz wybór, aby mieszać HW / SW fp lub użyć HW.

Wygenerowane linie poleceń są dodawane z tym dla zamierzonego celu:

-mfloat-abi=hard -mfpu=fpv4-sp-d16

Ramięatoli

 1
Author: SMFSW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 10:26:11

Miałem do czynienia z tym samym problemem. Próbowałem zbudować aplikację na Linuksa dla Cyclone V FPGA-SoC. Stanąłem przed problemem jak poniżej:

Error: <application_name> uses VFP register arguments, main.o does not
Korzystałem z toolchainu dostarczonego przez embedded software design tool firmy altera.

Rozwiązuje się go eksportując: mfloat-abi=hard do flags, a następnie arm-linux-gnueabihf-g++ kompiluje bez błędów. Dołącz również flagi w obu CC & LD.

 1
Author: Manish Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 16:48:40

W moim konkretnym przypadku zadziałało.

 0
Author: LS1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 22:41:09

Ta odpowiedź może wydawać się na powierzchni niezwiązana, ale istnieje pośrednia przyczyna tego komunikatu o błędzie.

Po pierwsze, " używa rejestru VFP..."komunikat o błędzie jest bezpośrednio spowodowany mieszaniem opcji mfloat-abi=soft i mfloat-abi=hard w Twojej kompilacji. To ustawienie musi być spójne dla wszystkich obiektów, które mają być połączone. Fakt ten jest dobrze omówiony w innych odpowiedziach na to pytanie.

Pośrednią przyczyną tego błędu może być otrzymanie przez Edytor Eclipse zdezorientowany przez popełniony przez siebie błąd w projekcie".cproject " plik. Edytor Eclipse często reswizzles linki do plików i czasami łamie się podczas wprowadzania zmian w strukturach katalogów lub lokalizacji plików. Może to również wpłynąć na ustawienia ścieżki do kompilatora gcc - i tylko dla podzbioru plików projektu. Chociaż nie jestem jeszcze pewien, co dokładnie powoduje tę awarię, zastępując .plik cproject z kopią zapasową poprawił ten problem. W moim przypadku zauważyłem .java.null.błędy wskaźnika po dodaniu ścieżki do katalogu include i odebraniu wiadomości "VFP register error" znikąd. W dzienniku budowy zauważyłem, że inna ścieżka do kompilatora gcc była używana dla niektórych moich źródeł, które były lokalne dla obszaru roboczego, ale nie wszystkie!? Dwa Kompilatory gcc używały różnych ustawień float z nieznanych powodów - stąd błąd rejestru VFP.

Porównałem .ustawienia cproject ze starszą kopią i obserwowane różnice we wpisach do źródeł powodujące problemy - mimo że wyłączono nadpisywanie ustawień projektu. Poprzez zastąpienie .plik cproject ze starą wersją problem zniknął, a tę odpowiedź zostawiam jako przypomnienie o tym, co się stało.

 0
Author: Rod Dewell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 22:42:51