2017-10-13 52 views
1

Windows 컴파일 7-64 비트 플랫폼에서 최신 GCC for RISCV에서 기본 컴파일을 수행하는 데 어려움이 있습니다. & RISCV 용 링크.GCC 7.1.1 RISCV 컴파일 (링크) 오류, 호환되지 않음 ABI

도구가 설치 : 7.1.1-2-20170912-2255이 https://github.com/gnu-mcu-eclipse/riscv-none-gcc/releases/

플랫폼에서받은 : 윈도우 7, 64 비트, 아니 Cygwin에서

프로그램 :

#include <stdint.h> 

int32_t iBlahblah; 
int main (void) 
{ 
    while(1) 
     iBlahblah++; 
    return 0; 
} 

명령 행 :

"c:\Program Files\GNU MCU Eclipse\RISC-V Embedded GCC\7.1.1-2-20170912-2255\bin\riscv64-unknown-elf-gcc.exe" -c hello.c -o hello -march=rv32imac -mabi=ilp32 -Os 
"c:\Program Files\GNU MCU Eclipse\RISC-V Embedded GCC\7.1.1-2-20170912-2255\bin\riscv64-unknown-elf-gcc.exe" -o hello.elf -march=rv32imac -mabi=ilp32 -Os -Wl,-Map=hello.lst hello.o 

출력 :

c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.o: ABI is incompatible with that of the selected emulation: target emulation `elf64-littleriscv' does not match `elf32-littleriscv' 
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: failed to merge target specific data of file hello.o 
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/lib/rv32imac/ilp32\libg.a(lib_a-exit.o): In function `.L0 ': exit.c:(.text.exit+0x1e): undefined reference to `_exit' 
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.elf(.text): relocation "iBlahblah+0x0 (type R_RISCV_HI20)" goes out of range 
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.o: file class ELFCLASS64 incompatible with ELFCLASS32 
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: final link failed: File in wrong format 
collect2.exe: error: ld returned 1 exit status 

큰 문제는 "ABI가 선택한 에뮬레이션과 호환되지 않습니다"라는 문제를 해결하는 방법입니다. 재배포, 퇴장 등에 관한 다른 문제는 무시해도됩니다. 왜냐하면 제 대형 환경이이를 처리하기 때문입니다 (현재 RISCV가 아닌 많은 플랫폼을 위해 구축 됨).

+0

riscv64에 gcc를 사용하고 32 비트 모드로 컴파일하려고합니다. 하지만이 gcc는 64 비트 모드 용 c 런타임 라이브러리를 링크 단계에 추가합니다 (gcc에 -v 옵션을 추가하여 gcc에서 추가 된 crt 파일을 볼 수 있음). 이것은 잘못되었습니다 (32 비트 엘프 및 64 비트 엘프 객체는 링크 할 수 없습니다. 함께).64 비트 모드의 64 비트 대상에는 gcc를 사용해야합니다. 32 비트 모드의 32 비트 대상 용 gcc (실제로 32 비트 crt가 필요하지만 gcc에 포함될 수 있지만 잘못된 버전 사용) – osgx

+0

@osgx https : // gnu-mcu-eclipse의 설명서 .github.io/toolchain/riscv/install/riscv64-unknown-elf-gcc.exe는 32 비트와 64 비트를 모두 타겟팅 할 수 있습니다. 32 비트 라이브러리는 어떻게해야할까요? –

+0

32 비트 CRT에 대한 올바른 경로를 사용하는 riscv32-unknown-elf-gcc.exe를 사용하십시오. 'riscv64-unknown-elf-gcc.exe -v ...'vs'riscv32-unknown-elf-gcc.exe -v ...'의 출력을 비교하여 CRT가있는 정확한 디렉토리를 찾으십시오. – osgx

답변

0

riscv64 - 알 수없는 엘프 - gcc.exe -c에서는 hello.c -o 안녕하세요 -march = rv32imac -mabi = ILP32 -Os

이 부분은 잘못된 것입니다. 문서 tolchain 귀하의 GCC는 말한다 지원 아키텍처의 많은 및 시스템과 riscv32 - 알 - ELF-GCC 대 https://gnu-mcu-eclipse.github.io/toolchain/riscv/

riscv64 - 알 - ELF-GCC, GCC는 고유 한 튜플과 이진 접두어 권장

<arch>-<vendor>-<os>-<libc/abi>- 

베어 메탈 툴체인의 현재 RISC-V 접두어는 riscv64-unknown-elf- 및 riscv32-unknown-elf-입니다.

글쎄,이 불행한 이름으로 혼동하지 마십시오. 아키텍처에 연결된 64 또는 32 ... 컴파일러가 64 비트 또는 32 비트 RISC-V 바이너리를 생성하지는 않습니다. 실제로 컴파일러는 -march와 -mabi를 기반으로하여 32/64 비트 바이너리를 생성합니다. 유일한 차이점은 -march 및 -mabi를 명령 행에 명시 적으로 설정하지 않고 컴파일러를 호출 할 때의 기본값입니다.

시도가 (아치 & ABI 이름에 r32 & 32 부품을 갖는) 32 비트 riscv 플랫폼을위한 프로그램을 컴파일 riscv32 - 알 수없는 엘프 - gcc.exe를 사용하기 위해서는 올바른 32 비트 CRT를 사용한다 파일.

riscv64가 32 비트 라이브러리 (https://gnu-mcu-eclipse.github.io/toolchain/riscv/#multiple-libraries, https://gnu-mcu-eclipse.github.io/blog/2017/09/13/riscv-none-gcc-v7-1-1-2-20170912-released/, https://gcc.gnu.org/onlinedocs/gccint/Target-Fragment.html MULTILIB_OPTIONS)를 검색 할 때 multilib을 지원하지만 다소 잘못되었습니다. riscv32 컴파일러, riscv64 컴파일러 및 여러 march/mabi 조합에 대한 gcc -v .... -o your_program.bin 결과를 게시하십시오.

+0

나는 할 수있다. 어디서나 미리 빌드 된 riscv32-unknown-elf 툴체인을 찾을 수 없습니다. (정말로 직접 가서 빌드 할 시간이 없습니다.) 표준 설치에는 라이브러리가 있습니다. gcc.exe가 ld.exe를 올바르게 호출하지 못하는 것 같습니다. 또는 ld.exe를 올바르게 호출하도록 올바른 마법 단어를 말하지 않습니다. –