X86 Linux에서 ARM용 GNU 툴체인 및 newlib 4.4를 처음부터 빌드할 수 없습니다.

X86 Linux에서 ARM용 GNU 툴체인 및 newlib 4.4를 처음부터 빌드할 수 없습니다.

저는 ARM에서 임베디드 RTOS를 개발 중이고 이제 X86 Linux 호스트(ubuntu-20.04)에서 ARM용 GNU 툴체인을 구축하려고 하므로 다음을 참조했습니다.https://gnutoolchains.com/building/

  1. binutils-2.42.tar.gz 다운로드
  2. gcc-11.3.0.tar.gz 다운로드
  3. newlib-4.4.0-20231231 다운로드
  4. mpc-1.0.3.tar.gz 다운로드
  5. mpfr-3.1.6.tar.bz2 다운로드
  6. gmp-4.3.2.tar.bz2 다운로드
  7. gdb-14.1.tar.gz 다운로드

다음과 같이 /home/t/testmnt/armtoolchain/에 추출합니다.

@t-VirtualBox:~/testmnt/armtoolchain$ ls -l
total 442348
drwxrwx--- 20 t t      4096 3月  21 09:11 binutils-2.42
drwxrwx--- 13 t t      4096 3月  23 18:06 binutils-2.42-build
-rwxrwx---  1 t t  51892456 1月  29 23:22 binutils-2.42.tar.gz
drwxrwx--- 38 t t      4096 4月  21  2022 gcc-11.3.0
drwxrwx--- 16 t t      4096 3月  23 19:56 gcc-11.3.0-build
-rwxrwx---  1 t t 143527306 4月  21  2022 gcc-11.3.0.tar.gz
drwxrwxr-x 23 t t      4096 3月  22 12:47 gdb-14.1
drwxrwxr-x 17 t t      4096 3月  22 12:53 gdb-14.1-build
-rw-rw-r--  1 t t  41058403 12月  3 13:39 gdb-14.1.tar.gz
drwxrwx--- 16 t t      4096 3月  21 10:37 gmp-4.3.2
-rwxrwx---  1 t t   1897483 2月   1  2010 gmp-4.3.2.tar.bz2
drwxrwx---  6 t t      4096 3月  21 10:42 mpc-1.0.3
-rwxrwx---  1 t t    669925 4月  28  2016 mpc-1.0.3.tar.gz
drwxrwx---  9 t t      4096 3月  21 10:46 mpfr-3.1.6
-rwxrwx---  1 t t   1287202 9月   7  2017 mpfr-3.1.6.tar.bz2
drwxrwx---  9 t t      4096 3月  22 08:05 newlib-4.4.0.20231231
drwxrwxr-x  4 t t      4096 3月  22 14:27 newlib-4.4.0.20231231-build
drwxrwx---  6 t t      4096 3月  23 18:07 out

먼저 gmp, mpc 및 mpfr을 구성 및 빌드하고 /usr/local/lib/에 설치했습니다.

binutils그런 다음 다음과 같이 구성하고 구축했습니다 .

cd binutils-2.42-build/
../binutils-2.42/configure -target arm-test-eabi --prefix /home/t/testmnt/armtoolchain/out/
make install-strip

gcc그런 다음 다음과 같이 구성하고 구축했습니다 .

cd gcc-11.3.0-build/
../gcc-11.3.0/configure --target=arm-test-eabi --build=x86_64-linux-gnu --host=x86_64-linux-gnu --prefix /home/t/testmnt/armtoolchain/out --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --enable-threads=posix --disable-tls --with-gnu-as --with-gnu-ld --with-newlib --with-headers=yes --build=x86_64-linux-gnu --host=x86_64-linux-gnu --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-multilib-list=aprofile,rmprofile --with-headers=/home/t/testmnt/armtoolchain/newlib-4.4.0.20231231/newlib/libc/include  --with-pkgversion='GNU Arm Embedded Toolchain 11.3.0'

make -j12

그러던 중 다음과 같은 오류가 발생했습니다.

make[4]: Entering directory '/home/t/testmnt/armtoolchain/gcc-11.3.0-build/arm-test-eabi/arm/v5te/softfp/libgcc'
# If this is the top-level multilib, build all the other
# multilibs.
/home/t/testmnt/armtoolchain/gcc-11.3.0-build/./gcc/xgcc -B/home/t/testmnt/armtoolchain/gcc-11.3.0-build/./gcc/ -B/home/t/testmnt/armtoolchain/out/arm-test-eabi/bin/ -B/home/t/testmnt/armtoolchain/out/arm-test-eabi/lib/ -isystem /home/t/testmnt/armtoolchain/out/arm-test-eabi/include -isystem /home/t/testmnt/armtoolchain/out/arm-test-eabi/sys-include    -g -O2 -marm -march=armv5te+fp -mfloat-abi=softfp -O2  -g -O2 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE  -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include   -fno-inline -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector   -fno-inline -I. -I. -I../../../../.././gcc -I../../../../../../gcc-11.3.0/libgcc -I../../../../../../gcc-11.3.0/libgcc/. -I../../../../../../gcc-11.3.0/libgcc/../gcc -I../../../../../../gcc-11.3.0/libgcc/../include    -o emutls.o -MT emutls.o -MD -MP -MF emutls.dep -fexceptions -c ../../../../../../gcc-11.3.0/libgcc/emutls.c -fvisibility=hidden -DHIDE_EXPORTS
In file included from ../../../../../../gcc-11.3.0/libgcc/gthr.h:148,
                 from ../../../../../../gcc-11.3.0/libgcc/emutls.c:31:
./gthr-default.h:102:9: error: 'pthread_once' undeclared here (not in a function); did you mean 'pthread_once_t'?
  102 | __gthrw(pthread_once)
      |         ^~~~~~~~~~~~
./gthr-default.h:90:19: note: in definition of macro '__gthrw2'
   90 |   static __typeof(type) name \
      |                   ^~~~
./gthr-default.h:102:1: note: in expansion of macro '__gthrw'
  102 | __gthrw(pthread_once)
      | ^~~~~~~
./gthr-default.h:103:9: error: 'pthread_getspecific' undeclared here (not in a function)
  103 | __gthrw(pthread_getspecific)
      |         ^~~~~~~~~~~~~~~~~~~
./gthr-default.h:90:19: note: in definition of macro '__gthrw2'
   90 |   static __typeof(type) name \
      |                   ^~~~
./gthr-default.h:103:1: note: in expansion of macro '__gthrw'
  103 | __gthrw(pthread_getspecific)
      | ^~~~~~~
./gthr-default.h:104:9: error: 'pthread_setspecific' undeclared here (not in a function)
  104 | __gthrw(pthread_setspecific)
      |         ^~~~~~~~~~~~~~~~~~~
./gthr-default.h:90:19: note: in definition of macro '__gthrw2'
   90 |   static __typeof(type) name \
      |                   ^~~~
./gthr-default.h:104:1: note: in expansion of macro '__gthrw'
  104 | __gthrw(pthread_setspecific)
      | ^~~~~~~
./gthr-default.h:106:9: error: 'pthread_create' undeclared here (not in a function); did you mean 'htab_create'?
  106 | __gthrw(pthread_create)
      |         ^~~~~~~~~~~~~~
./gthr-default.h:90:19: note: in definition of macro '__gthrw2'
   90 |   static __typeof(type) name \
      |                   ^~~~
./gthr-default.h:106:1: note: in expansion of macro '__gthrw'
  106 | __gthrw(pthread_create)
      | ^~~~~~~
./gthr-default.h:107:9: error: 'pthread_join' undeclared here (not in a function); did you mean 'pthread_kill'?
  107 | __gthrw(pthread_join)
      |         ^~~~~~~~~~~~
.....
.....

확인해 보니 ../newlib-4.4.0.20231231/newlib/libc/include/pthread.h다음과 같은 정의가 있습니다.

254 /* Thread Creation, P1003.1c/Draft 10, p. 144 */
255 
256 int pthread_create (pthread_t *__pthread, const pthread_attr_t  *__attr,
257             void *(*__start_routine)(void *), void *__arg);
258 
259 /* Wait for Thread Termination, P1003.1c/Draft 10, p. 147 */
260 
261 int pthread_join (pthread_t __pthread, void **__value_ptr);
....
....
298 #define PTHREAD_ONCE_INIT _PTHREAD_ONCE_INIT
299 
300 int pthread_once (pthread_once_t *__once_control,
301               void (*__init_routine)(void));

....
....
308 /* Thread-Specific Data Management, P1003.1c/Draft 10, p. 165 */
309 
310 int pthread_setspecific (pthread_key_t __key, const void *__value);
311 void *  pthread_getspecific (pthread_key_t __key);

구글링해서 비슷한 질문을 찾았는데, 그 중 하나는 건물 시스템에 문제가 있을 거라고 했는데, 문제가 무엇인지 모르겠습니다.

현재 빌드가 gcc-11.3.0실패합니다 enable-threads=posix. 이를 수정하고 newlib를 사용하여 ARM GNU 툴체인을 빌드하려면 어떻게 해야 합니까?

감사해요,

답변1

스레드 지원은 스레드를 실행할 수 있는 대상 운영 체제가 있는 경우에만 의미가 있습니다. 이는 베어 메탈 시스템의 경우가 아니므로 이러한 방식으로 구성된 GCC는 POSIX 스레드를 지원할 수 없습니다. 운영 체제 지원이 있더라도 newlib 및 GCC에 대한 특정 지원이 필요합니다.malloc잠금 기능예를 들어.

기본값( --enable-threads옵션 없음)으로 빌드하면 적절한 설정을 선택하면 제대로 작동합니다.

gcc-arm-none-eabiGCC 9 및 newlib 3.3이 충분하다면 Ubuntu 20.04에 이 패키지를 설치하여 문제를 해결할 수 있습니다. Ubuntu의 후속 버전에는 최신 버전의 GCC가 있지만newlib 4.4는 아직 Ubuntu에서 사용되지 않습니다.(Debian에서 사용 가능하므로 Ubuntu 24.10에서도 사용 가능해야 합니다.)

관련 정보