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

다음을 수행합니다.
  • "-T Tiny Hello World.lds"는 Tiny Hello World의 링크 제어 스크립트입니다
  • -e는 지정한 프로그램 입구 함수가nomain()이다
  • -static은ld가 정적 링크 방식의 링크 프로그램이지 기본적인 동적 링크 방식이 아니라는 것을 나타낸다
  • -o는 출력 파일의 이름을 "Tiny Hello World"로 지정했음을 나타냅니다

  • 다음과 같은 오류가 발생했습니다.
    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/

    좋은 웹페이지 즐겨찾기