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.
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.
Respostas:
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.
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.
alguns recursos:
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]
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.
ld
documentação : Normalmente, a última etapa na compilação de um programa é executar o ld.
NOP
sem-f
(ou-fbin
), ele compila para um único byte0x90
, 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 .section
as diretivas são geralmente ignoradas e apenas geram alinhamento.