O binario multiarquitetura ou binario gordo(em traducao literal) e um
programa de computador
que possui um
conjunto de instrucoes
de diversas
arquiteturas
de computador, podendo assim rodar em diferentes plataformas de
hardware
. O metodo de implementacao mais comum deste tipo de tecnologia, e a inclusao de
codigo de maquina
de varios conjuntos de instrucoes, gerando assim um
arquivo binario
evidentemente maior que aquele voltado a apenas uma plataforma computacional.
Esta tecnologia nao e algo implementado apenas a nivel de
sistema operacional
, pois existem varias maneiras de lidar com esta tecnologia, como por exemplo, um programa instalador, que seleciona a arquitetura adequada na operacao de instalacao, a distribuicao do
codigo-fonte
, para que seja compilado no momento da instalacao, ou ainda, uma compilacao do tipo
JIT
, com a utilizacao de uma
maquina virtual
.
A implementacao do binario multiarquitetura da
Apple Inc.
, veio no periodo de transicao arquitetural do
Macintosh
68k
, para o
PowerPC
, no ano de
1994
. Muitas aplicacoes da antiga arquitetura, rodavam de forma transparente em sua nova plataforma envolvendo um esquema de
emulacao
, porem, codigo emulado de uma forma geral roda em velocidades menores, a codigo nativo de uma determinada arquitetura. Eles fizeram isto juntando em um mesmo binario, trechos pertencentes a ambas as arquiteturas. Enquanto o codigo antigo 68k, residia na Resource fork,
[
1
]
o codigo mais atual PowerPC residia na data fork, no formato Preferred Executable Format,
[
2
]
criando um binario multiarquitetura.
[
3
]
Binarios gordos, foi uma funcionalidade dos sistemas operacionais
NeXT
e
NeXTSTEP
/OPENSTEP, comecando pelo NeXTSTEP 3.1. No NeXTSTEP, eles eram chamados "Multi-Architecture Binaries". Os binarios multiarquitetura eram compilados de forma que pudesser rodar em hadrware
Motorola 68k
,
IA-32
e
PC
, sendo apenas um arquivo binario, para todas as plataformas. Um tempo depois, permitia aplicacoes OPENSTEP rodar em PC e varias plataformas
RISC
que eram suportadas por tal sistema operacional. Binarios multiarquitetura eram arquivos com um formato especial, onde um arquivo armazenada um ou mais subarquivos
Mach-O
, e cada um destes representava uma arquitetura suportada. Cada arquivo binario multiarquitetura possuia uma
estrutura
(
struct fat_header
) contendo duas variaveis do tipo "unsigned integers". O primeiro inteiro (
magic
), servia para identificar o arquivo como um binario multiarquitetura. O segundo inteiro (
nfat_arch
), definia quantas arquiteturas aquele arquivo possuia(ou, quantas versoes compiladas para diferentes arquiteturas, aquele binario possuia). Apos este cabecalho, estruturas do tipo fat_arch(
struct fat_arch
) existiam no arquivo, que definiam "offset"(ponto de inicio do arquivo), definindo onde comecava determinado arquivo, o alinhamento, o tamanho da CPU e o tipo de arquitetura para o qual aquele subarquivo pertencia.
A versao da
GCC
entregue com as ferramentas de desenvolvimento, permitia a
compilacao cruzada
de um codigo-fonte para diferentes arquiteturas do
NeXTStep
. Por exemplo, era possivel escolher as arquiteturas alvo da compilacao, com o parametro '-arch'. Esta era uma forma bastante conveniente de se distribuir um software que rodava em diversas arquiteturas.
Tambem era possivel a criacao de bibliotecas, com diferentes
arquivos objeto
A
Apple
adquiriu a NeXT em meados de
1996
, e continuaram o trabalho com o OPENSTEP.
Mach-O
se tornou o
arquivo objeto
nativo no sistema operacional livre da Apple, o
Darwin
(2000) e o Apple
Mac OS X
(2001), e os binarios multiarquitetura vindos do NeXT, continuaram a ser suportados pelo sistema operacional. No Mac OS X, os binarios multiarquitetura podem ser usados em diversas variantes de uma arquitetura, e binarios
32-bit
, com codigo otimizado para as
geracoes de processadores
PowerPC G3
,
PowerPC G4
e
PowerPC 970
. Tambem suporta versoes 32-bit e
64-bit
do PowerPC.
[
4
]
Um
binario universal
e, uma tecnologia da
Apple Inc.
onde um tipo de arquivo executavel ou um pacote de aplicativos que roda nativamente em computadores
Macintosh
baseados tanto em processadores
PowerPC
da
IBM
como em
x86
Intel
.
FatELF
, e uma implementacao para
Linux
e outros
derivados do Unix
. Tecnicamente, o FatELF e uma extensao dos arquivos tipo
ELF
do Linux.
[
5
]
Adicionalmente a abstracao de arquitetura de computador e
ABI
, de acordo com o desenvolvedor Ryan C. Gordon o FatELF proveria as seguintes vantagens ao Linux
[
6
]
:
- Distribuicoes Linux nao precisariam separar os downloads por plataforma;
- A separacao de bibliotecas dentro de /lib, /lib32 e /lib64 nao seria mais necessaria na
estrutura de diretorios
;
- Os binarios e bibliotecas mais adequadas seriam escolhidas pelo sistema operacional, e nao por
shell scripts
;
- Se a
Interface binaria de aplicacao
mudar, software legado sera ainda suportado;
- Distribuicao de plugins de navegador que funcionam em qualquer arquitetura;
- Distribuicao de um binario unico sendo compativel entre Linux e BSD(e suas variantes), sem a necessidade de uma camada adicional de abstracao;
- O mesmo dispositivo raiz pode ser arrancado(bootado) em diferentes arquiteturas, para fins de desenvolvimento e experimentacao;
- Facilidade para aplicacoes portateis, que armazenados em um pen-drive podem ser utilizados em varios computadores;
Uma
maquina virtual
da distribuicao
Ubuntu
, pode ser encontrada aqui.
[
7
]
O projeto FatELF esta parado, porem, os
patches
podem ser encontrados no site do desenvolvedor, pois apos uma longa e calorosa discussao,
[
8
]
os desenvolvedores mais antigos do kernel Linux, acharam mais prudente e ate mesmo pouco vantajoso a inclusao de tais patches a arvore principal de software.