Compilação cruzada em C
Este será o primeiro de alguns artigos que irei abordar sobre compilação cruzada.
Definição
Compilação Cruzada é a capacidade de compilar um aplicativo para um processador que não é o que esta usando.
Definição grosseira, no wiki deve ter alguma melhor, rs.
O processo de compilação cruzada depende de como, e do alvo (target) que iremos compilar.
No nosso caso, iremos compilar uma aplicação 32bits em um sistema 64bits.
O nosso primeiro caso, é montar nossa aplicação.
Objetivo
Como objetivo deste artigo, apresentaremos compilação cruzada, desenvolvendo uma aplicação 32bits em um sistema 64bits linux.
Pré requisitos
Antes de começar precisamos preparar a máquina para compilação cruzada. Para isso, é necessário instalar as libs 32 bits em uma máquina 64 bits.
O primeiro passo é baixar o pacote:
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
pacotes para compilação cruzada
Ao instalar o pacote, seu sistema criará várias pastas.
Em geral, um programa não roda sozinho, ele chama uma série de libs que são associadas a funcionálidades. Uma aplicação 64 bits, nativa, aponta sempre para as /usr/lib, porem ao criar um ambiente misto, criamos dois conjuntos de pastas.
Ao compilar um ambiente 32 bits, as libs associadas ao ambiente 32 deverão estar instaladas na pasta /usr/lib32.
Agora para o ambiente 64bits, temos as libs /usr/lib64.
Ao instalar este pacote criamos esta divisão. Porem vale lembrar que criamos os pacotes básicos, cabe ao programador desenvolver e aferir qual o conjunto de pacotes ele irá necessitar, fazendo a instalação do referido pacote para cada uma das pastas necessárias.
Dado a explicação conceitual, vamos ao que interessa!
GIT
Para isso iremos montar um projeto no git, conforme nossa explicação:
https://github.com/marcelomaurin/croxcompile
Neste projeto, iremos fornecer um exemplo que pode ser baixado e utilizado como modelo.
Source: crox.c
#include <stdio.h>
void main(void){
printf("\nHello World\n");
}
Source: Makefile
PROGRAMA=HELLO
PROGRAMA32=HELLO32
CC=gcc
SOURCE= crox.c
all32: clean compile32
all: clean compile
clean:
rm -f *.o
rm -f $(PROGRAMA)
compile32:
$(CC) -m32 $(SOURCE) -o $(PROGRAMA32)
compile:
$(CC) $(SOURCE) -o $(PROGRAMA)
O programa crox, irá ser a base para gerar o nosso binário, de fato o mais importante aqui, será o Makefile.
Agora, o primeiro passo é compilar:
Para tanto, iremos executar:
make compile
compilação nativa, deve ser sempre padrão.
Neste caso, nossa máquina é 64 bits, então executaremos um binário quando chamado, 64bits puro.
make compile32
compilação 32 bits em uma máquina 64 bits
Agora, criando uma aplicação 32 bits, podemos comprovar isso, conforme demonstrado na nossa figura abaixo:
Gerados os binários temos que comprovar, que os mesmos, foram gerados nas plataformas alvo desejadas.
O LDD foi apresentado em artigo anterior, conforme link abaixo:
Desta forma irei me ater, apenas a apresentar a demonstração do binário.
ldd HELLO
Análise do binário gerado
agora iremos confirmar o resultado do 32 bits:
ldd HELLO32
análise do binário 32bits
Por fim, a tela apresentando os resultados executados.
Bibliografia e referências
https://www.geeksforgeeks.org/compile-32-bit-program-64-bit-gcc-c-c/