ELF 파일과 bin 파일의 차이점은 무엇입니까?


99

컴파일러가 생성 한 최종 이미지에는 bin 파일과 확장 로더 형식 ELf 파일이 모두 포함되어 있습니다. 두 파일의 차이점, 특히 ELF 파일의 유틸리티는 무엇입니까?


이것이 NASM이 말하는 것 입니다. ARM 전용은 아니지만 동일한 개념 일 가능성이 있습니다. 예를 들어, NOP없이 -f(또는 -fbin) 만 포함 된 파일을 컴파일하면 0x90.NET Framework가 포함 된 400 바이트 ELF 컨테이너 대신 단일 바이트로 컴파일됩니다 -felf32. 따라서 원시 코드 만 있고 컨테이너 메타 데이터는 없습니다. NASM은 MS-DOS .COM 및 .SYS 파일에 주로 사용된다고 말합니다 . section지시문은 대부분 무시되며 정렬 만 생성합니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

이것은 bin 파일이 유용 할 수있는 한 가지 방법입니다. 부팅 섹터를 만들어 운영 체제를 배포하는 것 : stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


94

Bin 파일은 메모리 수정이나 재배치가없는 순수 이진 파일로, 특정 메모리 주소에로드 할 명시적인 명령이있을 가능성이 높습니다. 이므로....

ELF 파일은 심볼 조회 및 재배치 가능 테이블로 구성된 실행 가능 링크 가능 형식입니다. 즉, 커널에 의해 모든 메모리 주소에서로드 될 수 있으며 사용 된 모든 기호는 해당 메모리 주소에서 오프셋으로 자동 조정됩니다. 로드되었습니다. 일반적으로 ELF 파일에는 'data', 'text', 'bss'와 같은 여러 섹션이 있지만 몇 가지 ... 런타임이 기호의 메모리 참조를 조정할 위치를 계산할 수있는 섹션 내에 있습니다. 런타임에 동적으로.


"특정 메모리 주소에로드 할 명시적인 명령이있을 가능성이 높습니다."이것은 bin 파일 생성 프로세스가 특정 주소에 데이터를로드하기위한 추가 코드를 추가한다는 의미입니까?
Penghe Geng

1
내가 배운 한 bin 파일은 오프셋 0에서 프로그램을 실행하는 것과 같으며 데이터 세그먼트가 포함되어 있습니다. 이것이 잘못된 경우 저를 수정하십시오.
Martin Kersten 2015

@MartinKersten 맞습니다. bin 파일은 오프셋 0부터 시작합니다.
t0mm13b

1
@ t0mm13b 그래서 .elf 파일은 일반 .hex 파일처럼 마이크로 컨트롤러에 구울 수 있지만 더 많은 플래시 메모리가 필요하며 마이크로가 재설정 될 때마다 섹션 주소가 변경됩니까?
Aelgawad

@BlackyDucky, 나는 그것이 가능하다고 믿지 않습니다. 마이크로 컨트롤러가 ELF 데이터를 직접 실행하려고하면 헤더와 기타 데이터를 명령어로 잘못 해석 할 것입니다.
jacobq

40

bin 파일은 롬 또는 프로그램을 실행할 특정 주소로 들어가는 비트와 바이트입니다. 이 데이터를 그대로 가져 와서 직접로드 할 수 있습니다. 일반적으로 거기에없는 기본 주소가 무엇인지 알아야합니다.

elf 파일은 bin 정보를 포함하지만 다른 많은 정보, 가능한 디버그 정보, 기호로 둘러싸여 있으며 바이너리 내의 데이터와 코드를 구분할 수 있습니다. 둘 이상의 이진 데이터 청크를 허용합니다 (이 중 하나를 bin에 덤프하면 다음 블록에 채울 데이터를 채우는 하나의 큰 bin 파일을 얻게됩니다). 얼마나 많은 바이너리가 있고 0으로 초기화되기를 원하는 bss 데이터가 얼마나 있는지 알려줍니다 (gnu 도구는 bin 파일을 올바르게 생성하는 데 문제가 있음).

elf 파일 형식은 표준이며 arm은 표준에 대한 개선 사항 / 변형을 게시합니다. 나는 모두가 거기에 무엇이 있는지 이해하기 위해 엘프 구문 분석 프로그램을 작성하는 것이 좋습니다. 라이브러리에 신경 쓰지 마십시오. 스펙의 정보와 구조를 사용하는 것은 매우 간단합니다. .bin 파일을 만드는 일반적인 gnu 문제와 bin 또는 elf 출력을 엉망으로 만들 수있는 링커 스크립트 및 기타 사항을 디버깅하는 데 도움이됩니다.


1
0x7C00은 elf를 반드시 사용하지 않는 부트 로더처럼 들립니다. 이것은 일반적인 질문입니다. 운영 체제에는 (가상) 주소 공간에 대한 규칙이 있고, 도구 체인은 해당 운영 체제 규칙을 대상으로해야합니다. 그러면 파일 형식은로드 된 주소와 진입 점 및 기타 항목이있는로드 가능한 항목을 나타냅니다. elf는 상자와 같은 컨테이너 일 뿐이며 대상 사용 사례에 맞게 포장해야합니다.
old_timer

1
일부 ascii를 vga로 인쇄하려면 일부 데이터가 있거나 수학적으로 데이터를 즉석에서 생성하거나 일부 조합을 수행 하는 프로그램 을 작성한 다음 해당 프로그램을 운영 체제 정의 코드 공간에로드 한 다음 실행합니다. 그것. 일반적으로 데이터를 물리적 주변 장치에 바로 밀어 넣지 않으며 어쨌든 그렇게 할 수 있거나 로더가 그렇게 할 수 있도록 허용하는 드문 운영 체제입니다.
old_timer

1
베어 메탈의 경우, 특히이 elf 파일이 부트 로더 및 / 또는 첫 번째 프로그램 실행 인 경우 elf 파일을 플래시를 프로그래밍하는 도구에 대한 디딤돌로 사용하므로 진입 점 및 _start는 관련이 없습니다 (예 : openocd over jtag) 또는 whatever-whatever-objcopy -O 바이너리 file.elf file.bin을 통해 해당 파일이 어떻게 든 플래시로로드됩니다. x86에서 부트 로더를 사용하지 않고 시도했지만 bios가 elf 파일을 구문 분석 할 수 없으므로 메모리 이미지 여야합니다. 그래서 -O 바이너리 유형 bin 파일
old_timer

1
별도의 엔티티는 하드웨어 / 로직 또는 기타 디자인입니다. 운영 체제의 경우 운영 체제가 규칙을 만들고 마이크로 컨트롤러의 경우 칩 / 프로세서 설계가 규칙을 만듭니다. 예를 들어 벡터 테이블이 있고 벡터가 핸들러를 가리키는 경우 모든 것을 링커 스크립트로 롤링해야하는 등로드 가능한 데이터가 해당 항목이 부팅되는 플래시로 향하도록해야합니다.
old_timer

1
대상이 운영 체제, 프로세서 또는 다단계 부트 로더 등의 규칙을 갖도록 확장하려면 이러한 규칙을 기반으로 "바이너리"를 빌드해야합니다. 부트 스트랩과 링커 스크립트가 가장 중요합니다. 그런 다음 각 대상과 해당 바이너리를 적용하는 방법 및 지원되는 파일 형식에 대해 매우 광범위합니다. 여러 호스트 개발 플랫폼에서 gnu를 가정하면 elf 파일 형식이 기본 출력이고 필요에 따라 도구 (대상 특정 유틸리티 / 로더 인 경우)를 사용하여 elf에서 다른 것으로 추출하거나 변환합니다.
old_timer

30

일부 리소스 :

  1. ARM 아키텍처 용 ELF
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. wiki의 ELF
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF 형식은 일반적으로 컴파일의 기본 출력입니다. GNU 도구 체인을 사용하는 경우 다음과 같이 objcopy를 사용하여 이진 형식으로 변환 할 수 있습니다.

  arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]

또는 fromELF 유틸리티 사용 (ADS와 같은 대부분의 IDE에 내장 됨) :

 fromelf -bin -o [binary-output-file] [elf-input-file]

6
이 bin 파일 세부 답하기 후 첨가하고, 않습니다 추가에 실질적으로 유용한 기술. +1.
erbdex

-1

여기서 요점을 수정하고 싶습니다. ELF 파일은 컴파일러가 아닌 링커에 의해 생성됩니다.

컴파일러 임무는 소스 코드 파일에서 개체 파일 (* .o)을 생성 한 후 종료됩니다. 링커는 모든 .o 파일을 함께 연결하고 ELF를 생성합니다.


질문에 대한 답변이 아니고 반드시 정확하지 않기 때문에 비추천했습니다. 광범위하게 정의 된 컴파일에는 연결이 포함됩니다. ld문서 에서 인용 : 일반적으로 프로그램 컴파일의 마지막 단계는 ld를 실행하는 것입니다.
bzeaman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.