2012-12-27 4 views
-1

나는 gcc으로 다음 프로그램을 컴파일 및 출력 실행 파일 a.out가 나타납니다.a.out이 기계어로 된 이유는 무엇입니까?

#include <stdio.h> 
int main() { 
    printf("hello, world\n"); 
} 

내가 cat a.out을 실행, 왜 (?이 소위) "횡설수설"과 아닌 기계 언어 파일입니다 0과 1 :

??????? H__PAGEZERO(__TEXT__text__TEXT?`??__stubs__TEXT 
P__unwind_info__TEXT]P]__eh_frame__TEXT?H??__DATA__program_vars [continued] 
+2

'xxd -b a.out'. 0, 1이 있습니다. :) – netcoder

답변

10

파일이 0과 1에 있지만 텍스트 편집기 그 비트가 바이트 단위로 그룹화 한 후 텍스트로 처리되어 그것을 열 때, 리눅스에서) 출력 파일을 분해을 시도 할 수 있습니다 기계 명령어 (x86 아키텍처)가 포함되었는지 확인 :

objdump -D -mi386 a.out

출력 예 :

1: 83 ec 08    sub $0x8,%esp 
4: be 01 00 00 00   mov $0x1,%esi 
9: bf 00 00 00 00   mov $0x0,%edi 

번째 열이 0과 1의 16 진수와 제 3 컬럼은 어셈블러 니모닉 명령어를 포함 포함한다.

표시 할 경우 그 0과 1은 단순히 입력 것 :

xxd -b a.out

예 출력 :

0000000: 01111111 01000101 01001100 01000110 00000010 00000001 .ELF.. 
0000006: 00000001 00000000 00000000 00000000 00000000 00000000 ...... 
+3

또한이 파일은 실행 파일뿐 아니라 모든 파일에 해당됩니다. – sepp2k

+2

그래, 아날로그 파일 같은 것이 없으므로 모든 단일 파일은 2 진수 (비트)로 구성됩니다.기계 코드, 텍스트 파일, 소스 파일, 오브젝트 파일, 데이터베이스. 모두 바이너리 파일입니다. –

5

그것은 executable file format 어떤 종류의에의합니다. 리눅스에서는 아마도 ELF이고, Mac OS X에서는 아마 Mach-O입니다. 심지어 a.out 형식이 있지만 더 이상 일반적이지 않습니다.

그냥 베어 기계 명령어가 될 수 없습니다 - 운영 체제가

+2

그게 사실이지만, 당신은 OP의 주요 혼란을 놓친 것 같아요. 베어 메탈 인스트럭션이라 할지라도 OP는 텍스트 에디터에서 파일을 열 때 분명히 0과 1을 보지 못합니다 (이것은 분명히 예상 한 것입니다). – sepp2k

1

문자는 0과 1로 만들어진 그것에 어떤 동적 라이브러리를 연결,로드하는 방법에 대한 몇 가지 정보 등이 필요하고, 컴퓨터는 그 차이를 알 수있는 방법이 없습니다. 당신은 그 파일을 보여달라고 요구했고 그것은 그것을했다.

바이너리 파일에는 기계 명령어 외에 판독 가능한 문자열 일 수있는 레이아웃 및 선택적 디버그 정보가 들어 있습니다.

1

a.out은 사용중인 OS의 로더가 이해할 수있는 형식입니다. 당신이 보는 다른 텍스트는 기대하는 0과 1의 다른 부분에 대한 마커입니다.

? 및`이진 인쇄 할 수없는 데이터가있는 곳을 보여줍니다.

0

요즘 Linux 시스템의 일반적인 형식은 ELF입니다. ELF 파일은 objdump 유틸리티로 검사 할 수있는 기계 코드를 포함 할 수 있습니다.

 
$ gcc main.c 
$ objdump -d -j .text a.out 

a.out:  file format elf64-x86-64 


Disassembly of section .text: 
(code omitted for brevity) 
00000000004005ac : 
    4005ac:  55      push %rbp 
    4005ad:  48 89 e5    mov %rsp,%rbp 
    4005b0:  bf 6c 06 40 00   mov $0x40066c,%edi 
    4005b5:  e8 d6 fe ff ff   callq 400490 
    4005ba:  5d      pop %rbp 
    4005bb:  c3      retq 
    4005bc:  0f 1f 40 00    nopl 0x0(%rax) 

참조? 기계 코드. objdump 유틸리티는 해당 디스 어셈블 된 코드가 오른쪽에 있고 왼쪽에 주소가있는 16 진수로 인쇄합니다.