Qual é a diferença entre arquivos ELF e arquivos bin?


97

As imagens finais produzidas pelos compiladores contêm tanto o arquivo bin quanto o arquivo ELf do formato de carregador estendido, qual a diferença entre os dois, principalmente a utilidade do arquivo ELF.


Isso é o que o NASM tem a dizer . Não é específico do ARM, mas provavelmente tem o mesmo conceito. Por exemplo, se você compilar um arquivo contendo apenas NOPsem -f(ou -fbin), ele compila para um único byte 0x90, em vez de um contêiner ELF de 400 bytes com -felf32. Portanto, apenas o código bruto, sem metadados de contêiner. O NASM diz que é usado principalmente para arquivos .COM e .SYS do MS-DOS . sectionas diretivas são geralmente ignoradas e apenas geram alinhamento.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Esta é uma maneira em que os arquivos bin podem ser úteis: para fazer um setor de boot para implantar sistemas operacionais: stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:


94

Um arquivo Bin é um arquivo binário puro sem ajustes ou realocações de memória, muito provavelmente ele tem instruções explícitas para ser carregado em um endereço de memória específico. Enquanto que....

Os arquivos ELF são Executable Linkable Format que consiste em uma pesquisa de símbolos e uma tabela relocável, ou seja, pode ser carregado em qualquer endereço de memória pelo kernel e automaticamente, todos os símbolos usados, são ajustados para o deslocamento daquele endereço de memória onde ele foi carregado em. Normalmente os arquivos ELF têm várias seções, como 'dados', 'texto', 'bss', para citar apenas alguns ... é dentro dessas seções onde o tempo de execução pode calcular onde ajustar as referências de memória do símbolo dinamicamente em tempo de execução.


"mais do que provavelmente ele tem instruções explícitas para ser carregado em um endereço de memória específico": isso significa que o processo de geração de arquivo bin adiciona código adicional para carregar dados em um endereço específico?
Penghe Geng

1
Até onde eu aprendi, o arquivo bin é como executar o programa a partir do deslocamento 0 e o segmento de dados está embutido nele. Se isso estiver errado, por favor me corrija.
Martin Kersten,

@MartinKersten correto, os arquivos bin começam no deslocamento 0.
t0mm13b

1
@ t0mm13b Assim, os arquivos .elf podem ser gravados em um microcontrolador como um arquivo .hex normal, mas é preciso mais memória flash e, sempre que o micro é reiniciado, os endereços das seções mudam?
Aelgawad

@BlackyDucky, não acredito que seja possível. Se um microcontrolador tentasse executar dados ELF diretamente, interpretaria incorretamente os cabeçalhos e outros dados como instruções, certo?
iX3 de

40

Um arquivo bin são apenas os bits e bytes que vão para a rom ou um endereço específico a partir do qual você executará o programa. Você pode pegar esses dados e carregá-los diretamente como estão, você precisa saber qual é o endereço base, pois normalmente ele não está lá.

Um arquivo elf contém as informações bin, mas é cercado por muitas outras informações, possíveis informações de depuração, símbolos, que podem distinguir o código dos dados dentro do binário. Permite mais de um bloco de dados binários (quando você despeja um deles em uma caixa, você obtém um grande arquivo bin com dados de preenchimento para colocá-lo no próximo bloco). Informa quantos binários você tem e quantos dados bss existem que desejam ser inicializados com zeros (as ferramentas GNU têm problemas para criar arquivos bin corretamente).

O formato de arquivo elf é um padrão, a arm publica seus aprimoramentos / variações do padrão. Eu recomendo que todos escrevam um programa de análise de elfo para entender o que está lá, não se preocupe com uma biblioteca, é bastante simples usar apenas as informações e estruturas nas especificações. Ajuda a superar problemas gnu em geral, criando arquivos .bin, bem como depurando scripts de linker e outras coisas que podem ajudar a bagunçar sua saída bin ou elf.


1
0x7C00 soa como um bootloader que não usa o elf necessariamente. esta é uma questão genérica. um sistema operacional teria regras para os espaços de endereço (virtuais), a cadeia de ferramentas precisaria ser direcionada a essas regras de sistema operacional, então o formato do arquivo indicaria itens carregáveis ​​com endereços mais um ponto de entrada depois de carregado, além de outras coisas. elf é apenas um contêiner, como uma caixa, você deve embalá-lo corretamente para o caso de uso pretendido.
old_timer

1
se você quiser imprimir algum ascii para o vga, você escreve um programa para fazer isso que tem alguns dados ou gera matematicamente os dados em tempo real ou alguma combinação, então você carrega esse programa no espaço de código definido do sistema operacional e, em seguida, executa isto. você geralmente não empurra os dados direto para um periférico físico, e é o raro sistema operacional que permite que você faça isso de qualquer maneira, ou permita que seu carregador faça isso.
old_timer

1
para bare metal, esp se este arquivo elf for o bootloader e / ou o primeiro programa executado, então o ponto de entrada e _start não são relevantes, já que você usa o arquivo elf como um trampolim para uma ferramenta que programa o flash (como openocd over jtag) ou através de qualquer-qualquer-objcopy -O arquivo binário.elf file.bin e então esse arquivo é de alguma forma carregado no flash. Não tentei um bootloader no x86, mas assumiu que o BIOS não consegue analisar arquivos elf, então também precisaria ser uma imagem de memória. portanto, um arquivo bin do tipo -O binário
old_timer

1
a entidade separada é o hardware / lógica ou outro projeto. para sistemas operacionais, então o sistema operacional faz as regras; para um microcontrolador, o design do chip / processador faz as regras. por exemplo, se houver uma tabela de vetores e os vetores apontarem para os manipuladores, você terá que colocar tudo isso em seu script de vinculador, etc, para que os dados carregáveis ​​sejam destinados ao flash de onde a coisa inicializa.
old_timer

1
Para ampliar que seu alvo tem regras, seja um sistema operacional ou um processador ou um bootloader multiestágio, etc. E você precisa construir seu "binário" baseado nessas regras, o bootstrap e linkerscript sendo os mais importantes. Em seguida, é muito amplo para cada destino e como você aplica esse binário e quais formatos de arquivo são suportados. Assumindo gnu em várias plataformas de desenvolvimento de host, o formato de arquivo elf é a saída padrão e então você usa as ferramentas conforme necessário (se os utilitários / carregadores específicos de destino) para extrair ou converter do elf para qualquer outra coisa.
old_timer

30

alguns recursos:

  1. ELF para a arquitetura ARM
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF do wiki
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

O formato ELF é geralmente a saída padrão da compilação. se você usa cadeias de ferramentas GNU, pode traduzi-lo para o formato binário usando objcopy, como:

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

ou usando o utilitário fromELF (embutido na maioria dos IDEs como o ADS embora):

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

6
Este foi adicionado após o detalhe arquivo bin foi respondida, e não add-on uma técnica praticamente útil. 1 para isso.
erbdex

-1

Eu só quero corrigir um ponto aqui. O arquivo ELF é produzido pelo Linker, não pelo compilador.

A missão do compilador termina após produzir os arquivos objeto (* .o) a partir dos arquivos de código-fonte. O vinculador vincula todos os arquivos .o e produz o ELF.


Não votou porque não está respondendo à pergunta nem está necessariamente correto. Amplamente definida, a compilação inclui links. Citado na lddocumentação : Normalmente, a última etapa na compilação de um programa é executar o ld.
bzeaman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.