programing

ARM에 대한 새로운 리브와 함께 GCC를 교차 컴파일: -march와 같은 GCC 옵션을 지정하는 방법?

closeapi 2023. 9. 28. 08:23
반응형

ARM에 대한 새로운 리브와 함께 GCC를 교차 컴파일: -march와 같은 GCC 옵션을 지정하는 방법?

저는 ARM 타겟에 대한 맥 OS X에 대한 새로운 리브와 함께 GCC를 컴파일했습니다.그러나 libc.a는 -fshort-enums로 컴파일되었으며, ARM을 위해 무언가를 컴파일할 때 -fno-short-enums를 사용하기 때문에 원하지 않습니다.이는 물론 다음과 같습니다.

ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail

"Hello, World!" 실행 파일을 실행하려고 할 때마다 오류가 발생합니다.이것이 이유일까요?

hello.c를 컴파일할 때 사용한 명령어는 다음과 같습니다.

arm-eabi-gcc \
hello.c -o hello \
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \
-v -nostdinc -nostdlib -static \
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \
-I/Users/user/gcc-arm-install/arm-eabi/include \
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \
-L/Users/user/gcc-arm-install/arm-eabi/lib \
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \
-lm -lc -lgcc

업데이트:

알겠습니다, 문제를 newlib의 libc와 startup files(crt0.o)의 조합으로 좁힌 것 같습니다.안드로이드 NDK의 libc.a와 startup 파일을 이용하여 GCC 4.7.0으로 테스트 앱을 컴파일해보았는데 정적으로 컴파일하면 전화기에서 작동했습니다.사실, 그것은 libgcc가 "가변 크기의 열거형"(즉, 다른 모든 것과 같이 -fno-short-enum으로 컴파일되지 않음)을 사용하는 것에 대해 다시 불만을 제기했음에도 불구하고 작동했습니다.그래서 이전의 충돌 바이너리에서 -fno-short-enums가 범인이라는 가설은 틀렸습니다.

효과는 다음과 같습니다.

Binutils와 GCC 4.7.0은 "암-리눅스-아비"를 대상으로 소스에서 컴파일되었습니다.저는 --with-newlib(GCC 소스 트리의 newlib 및 libgloss)을 사용하여 GCC를 구성했습니다.그래서 실제로 GCC는 newlib과 함께 구축되어 newlib과 함께 설치되었으며, 제가 newlib의 libc와 실제로 링크하지 않는 한 작동하는 바이너리를 생성합니다.현재 안드로이드 NDK와 그 스타트업 파일의 libc를 대신 사용해야 합니다.

제 컴파일 스크립트는 이렇게 생겼습니다.NDK에 대한 포함 경로 및 라이브러리 경로에는 및 libc가 포함됩니다.

NDK_PATH="/Users/user/SOURCE/android-ndk-r8/platforms/android-9/arch-arm"
CFLAGS="-nostdinc -nostdlib -static -fno-short-enums -lc -lgcc -lc"

gcc $NDK_PATH/usr/lib/crtbegin_static.o \
hello.c -o hello $CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o

나는 여전히 newlib의 libc가 작동하는 바이너리를 정적으로 컴파일하고 싶습니다.셸 스크립트로 돌아가기...

나는 업무를 위해 Cortex-M3 플랫폼을 위해 교차 구축하고, newlib도 사용합니다.다음 링크가 도움이 될 수 있습니다.

http://frank.harvard.edu/ ~ 콜드웰/툴체인/ http://www.microbuilder.eu/Tutorials/SoftwareDevelopment/BuildingGCCToolchain.aspx

다음 링크는 Cortex-M3에 특화되어 있지만, 통찰력을 제공할 수도 있습니다. http://www.johannes-bauer.com/mcus/cortex/ ?menuid=5의 툴체인 빌드를 스크립팅하기 위해 사용했습니다.

새 lib가 잘못 컴파일되었을 수 있습니다(호스트 컴파일러를 사용할 수도 있습니까?).링크가 되기 때문에 가능성이 매우 낮지만, 이봐 가능해).

우선 gcc 또는 arm-gcc에서 작업할 것처럼 셸 스크립트를 작성하여 작업 env를 선택할 수 있습니다. 이 스크립트에서 다른 lib로 대체 lib 링크를 만들 수 있습니다. 로그인하여 gcc를 선택하면 lib 파일이 일반 libc가 되고 arm-gcc를 선택하면 lib가 다른 lib가 됩니다.

언급URL : https://stackoverflow.com/questions/10810008/cross-compiling-gcc-with-newlib-for-arm-how-to-specify-gcc-options-like-march

반응형