Linux ubuntu 14.04 x86_64 플랫폼 gcc 컴파일 오류 오류: unsupported instruction`mov'및ld 링크 오류
1. 환경은 다음과 같습니다.
$gcc -v: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu
gcc version: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
2. 소스 코드:
클래식 HelloWorld 어셈블리 프로그램
/*
*TinyHelloWorld.c
*/
char* str = "Hello World!
";
void print(){
asm( "movl $13,%%edx
\t"
"movl %0,%%ecx
\t"
"movl $0,%%ebx
\t"
"movl $4,%%eax
\t"
"int $0x80
\t"
::"r"(str):"edx","ecx","ebx");
}
void exit() {
asm( "movl $42,%ebx
\t"
"movl $1,%eax
\t"
"int $0x80
\t");
}
void nomain() {
print();
exit();
}
3. 번역 오류
$gcc -c -fno-builtin TinyHelloWorld.c
그 중에서'-fno-builtin'은 GCC 내장 함수(built-in function) 최적화 기능을 닫는 데 사용된다.
다음과 같은 오류가 발생했습니다.
TinyHelloWorld.c: Assembler messages:
TinyHelloWorld.c:5: Error: unsupported instruction `mov'
문제 원인: 64비트 시스템에서 32비트의 목표 파일을 컴파일하는 것은 불법이다.
해결 방안:'-m32'로 32비트 ABI를 강제로 컴파일하면 컴파일할 수 있습니다.
$gcc -c -fno-builtin -m32 TinyHelloWorld.c
4. 링크 오류
$ld -static -T TinyHelloWorld.lds -e nomain -o TinyHelloWorld TinyHelloWorld.o
다음을 수행합니다.
다음과 같은 오류가 발생했습니다.
ld: i386 architecture of input file `TinyHelloWorld.o' is incompatible with i386:x86-64 output
문제 원인: 대상 파일'TinyHelloWorld를 입력합니다.o'는 32비트 시스템이지만 저희 플랫폼은 64비트입니다. (기본 링크 스크립트는/usr/lib/ldscripts 아래에 있습니다. x86_64 플랫폼 기본 링크 64비트 실행 파일은elf_x86_64.x를 사용하고 32비트 실행 가능한 파일을 링크하는 것은elf32_x86_64.x를 사용합니다. 직접ld가 일치하지 않으므로 링크 스크립트가 입력 대상 파일에 대응하도록 지정해야 합니다.
해결 방안: 링크할 때 "-m elf_i386"를 추가합니다. 대상 파일을 i386 플랫폼으로 입력하기 때문입니다.
$ld -static -m elf_i386 -T TinyHelloWorld.lds -e nomain -o TinyHelloWorld TinyHelloWorld.o
참조 링크:https://stackoverflow.com/questions/11372024/what-does-the-gcc-error-message-error-unsupported-for-mov-mean
https://www.linuxquestions.org/questions/programming-9/assembly-error-i386-architecture-incompatible-with-i386-x86-64-output-827609/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.