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:

http://maurinsoft.com.br/index.php/2020/11/25/analisando-uma-lib/

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.

Demonstração da compilação cruzada

Bibliografia e referências

https://www.geeksforgeeks.org/compile-32-bit-program-64-bit-gcc-c-c/

https://www.filipeflop.com/blog/o-que-e-compilacao-cruzada/