-o
이는 g++ 및 (outfile) 플래그 와 같이 컴파일러에서 직접 가져온 파일에 관한 것입니다 .
바이너리라면 그냥 0과 1의 묶음이어야 하지 않나요?
캡처하면 이해할 수 없는 출력이 나오지만 완전한 단어도 나옵니다.
파일로 정리하면 즉시 답변을 얻을 수 있습니다. 계산이 필요하지 않은 것 같습니다. 바이너리에 실제로 그러한 정보가 포함된 헤더가 있습니까?
저는 바이너리 실행 파일을 방금 컴파일된 프로그램, 즉 CPU가 즉각적이고 명확하게 이해할 수 있는 기계 명령의 형태로 생각합니다. 그렇다면 명령어 세트는 단지 비트 패턴이 아닐까? 하지만 바이너리에는 또 무엇이 있습니까? 이 비트를 어떻게 표시하나요?
또한, 어떻게든 프로세서 매뉴얼을 구했다면 한 번에 하나의 기계 명령어씩 바이너리를 손으로 작성할 수 있습니까? 매우 비효율적이겠지만,매우"Hello World!"도 작동하게 만들면 재미있습니다. 데모.
답변1
슈퍼유저 질문:텍스트 편집기로 바이너리 파일을 열 때 바이너리 코드가 표시되지 않는 이유는 무엇입니까?첫 번째 요점을 아주 잘 해결했습니다.
바이너리와 텍스트 데이터는 분리되지 않고 단지 데이터일 뿐입니다. 그것은 그것들을 둘 중 하나로 만드는 해석에 달려 있습니다. 텍스트 편집기에서 이진 데이터(예: 이미지 파일)를 열면 선택한 해석(텍스트)을 따르지 않기 때문에 많은 데이터가 의미가 없게 됩니다.
파일은 0과 1로 저장됩니다(예: 메모리의 전압/전압 없음, 하드 드라이브의 자화/자화 없음). 0/1 시퀀스는 사람에게 별로 유용하지 않기 때문에 파일을 읽을 때 0과 1을 볼 수 없습니다. cat
문자가 더 의미가 있고 16진수 덤프가 대부분의 목적에 더 좋습니다( hexdump
파일을 사용해 보세요).
실행 가능 파일제목 있음빌드된 프로그램의 아키텍처, 파일의 어떤 부분이 코드와 데이터인지 등의 매개변수를 설명합니다. 이는 file
바이너리 파일의 특성을 식별하는 데 사용됩니다.
마지막으로: 그렇습니다. CPU opcode를 직접 사용하여 어셈블리 언어로 프로그램을 작성할 수 있습니다. 보세요UNIX 어셈블리 프로그래밍 소개그리고인텔 x86 문서출발점으로.
답변2
모든 파일은 1과 0으로 저장됩니다. cat은 각 BYTE(8비트)를 문자로 해석하려고 시도하므로 이해할 수 없는 문자가 표시됩니다.
답변3
모든 파일은 내부적으로 바이너리입니다. 즉, 일련의 파일로 저장됩니다.조금.
파일의 비트는 실제로 다음과 같이 그룹화됩니다.바이트. 각 파일은 정수 바이트로 구성됩니다. 모든 UNIX 시스템, 그리고 실제로 거의 모든 컴퓨터에는 8비트(라고 함)로 구성된 바이트가 있습니다.팔중주네트워킹 측면에서). 바이트를 0에서 2 8 -1 = 255 사이의 숫자 인 8비트 숫자로 해석하는 자연스러운 방법이 있습니다 .
이를 바이너리로 처리하려면 바이너리 표현으로 작성하는 도구가 필요합니다. 인간은 이진 표현에 적합하지 않습니다. 무엇이든 작성하려면 시간이 오래 걸립니다. 더 일반적으로 사용되는 것은16진수16개의 다른 숫자로 구성된 기호입니다. 예를 들어 41
(16진수 65)는 01000001
(2진수 65)보다 읽기 쉽습니다. 당신은 다음과 같은 것을 사용할 수 있습니다od
("8진수 덤프") 또는 각 바이트의 8진수 또는 16진수 표현으로 파일을 hexdump
나열합니다 ( 16진수로 전환).hd
od -t x1
바이트는 문자를 나타낼 수 있습니다. 몇 개 있어요문자 인코딩UNIX 세계에서 사용됩니다. 그것들은 모두 다음을 기반으로 합니다.ASCII 코드0에서 127 사이의 바이트 해석을 정의합니다. 이는 가능한 바이트 값 중 절반의 의미만 정의한다는 점에 유의하세요. 예를 들어 65는 대문자 A
, 97은 소문자 a
, 30은 숫자 0
등을 나타냅니다. 예를 들어 일부 문자 인코딩은 1바이트를 사용하여 각 문자를 나타냅니다.라틴어 1코딩, 163은 £
, 241은 ñ
을 나타냅니다. 이 방법으로 최대 256자를 표현할 수 있는데, 이는 많지 않습니다. 따라서 문자당 여러 바이트를 사용하는 다른 인코딩이 있습니다. 오늘날 유닉스 세계의 사실상의 표준 인코딩은 다음과 같습니다.UTF-8, 이는 가변 길이 인코딩입니다(다른 문자는 다른 바이트 수를 차지함).통합 문자 집합.
텍스트 파일은 이해할 수 있는 텍스트가 포함된 바이너리 파일입니다. 실제로 UNIX 프로그램의 경우 두 가지 조건이 충족되는 한 파일은 텍스트 파일입니다.
- 텍스트 파일에는 null 바이트(값이 0인 바이트)가 포함될 수 없습니다. 이 바이트는 어떤 문자도 나타내지 않으며 많은 텍스트 조작 프로그램에서 내부적으로 특수 표시로 사용됩니다.
- 텍스트 파일은 일련의 줄로 구성되며, 각 줄은새로운 팀문자(값은 10)입니다.
기계 실행 파일은 특별한 유형의 바이너리 파일입니다. 명령을 실행 하면 cat
가끔 텍스트가 포함된 쓰레기가 표시됩니다. 이러한 파일에는 터미널에 대한 명령이 포함될 수도 있습니다. 이 프로그램을 사용하면 strings
인쇄할 수 없는 문자를 무시하고 이진 파일의 모든 텍스트 조각을 볼 수 있습니다.
기계 실행 파일은 정확히 일련의 기계 명령어가 아닙니다. 여기에는 운영 체제에 파일을 메모리에 로드하는 방법을 알려주는 몇 가지 추가 정보, 종종 프로그램에서 사용하는 일부 데이터 및 선택적 디버깅 정보도 포함되어 있습니다. 대부분의 UNIX 시스템에서는매우 낮은 주파수기계 실행 파일의 형식입니다. 이 형식은 기계어 코드가 포함된 파일이 기계 아키텍처와 독립적인 부분으로 분할되는 방식을 지정합니다. 일부 부분은 특정 기계 아키텍처에 특정한 의미를 갖는 코드를 포함합니다.
이 명령을 사용하면 objdump -D /path/to/machine-executable
사람이 읽을 수 있는 형식으로 실행 파일 목록을 표시할 수 있습니다.어셈블리어. 뭐, 훈련받은 사람이라면 누구나 읽을 수 있습니다. 어셈블리 언어는 프로세서 아키텍처에 따라 다르며 기계 명령어에 직접 매핑됩니다.
어셈블리 언어로 완전한 프로그램을 작성하는 것은 가능하지만 시간이 오래 걸리기 때문에 중요한 프로그램에서는 거의 수행되지 않습니다. 정말 미쳤다면 프로그램을 바이너리로 직접 작성할 수도 있습니다. 어떤 사람들은 프러포즈를 하려고 해인쇄할 수 있는 가장 짧은 프로그램Hello world
; Ryan Henszey가 작성 방법을 설명합니다.PC 프로세서용 142바이트 ELF 실행 가능;브라이언 라이터ELF 형식을 분석하여 45바이트 프로그램 제안Linux는 실행할 의향이 있습니다(프로그램은 아무것도 인쇄하지 않습니다).
바이너리가 아닌 실행 파일도 있습니다.스크립트. 반면 이미지, 비디오, 압축 파일, 워드 프로세싱 문서, 실행 파일이 없는 코드 라이브러리 등 실행할 수 없는 바이너리 파일이 많이 있습니다.진입 지점, 다른 프로세서 아키텍처용 실행 파일,...