Quais são as considerações de tempo de compilação para reduzir o tamanho do binário no Linux?

1

Eu compilei um utilitário e criei o binário no meu sistema Linux. Mas o tamanho deste binário é de 2,3 MB e eu preciso reduzir o tamanho deste binário. Eu tentei aplicar STRIP no binário, mas não é suficiente. Então, há alguma opção (configuração talvez) que eu possa aplicar durante a compilação do utilitário?

Agradecemos antecipadamente pela sua resposta.

    
por nyk_mat 21.10.2013 / 11:27

2 respostas

3

Você pode usar o sinalizador -os se estiver usando o GCC para compilar. Você pode encontrá-lo aqui na página de sinalizadores do GCC -

-Os
    Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

    -Os disables the following optimization flags:

              -falign-functions  -falign-jumps  -falign-loops 
              -falign-labels  -freorder-blocks  -freorder-blocks-and-partition 
              -fprefetch-loop-arrays

Se você por algum motivo precisar ter esses sinalizadores, bem, isso não é para você. Além disso, você está comprometendo o desempenho para o tamanho

Você também pode usar vários métodos de compactação executável como upx , publique a compilação para tornar o tamanho do seu executável menor. Essa também é uma compensação de desempenho / tamanho (embora bastante mínima), mas pode ser usada além da otimização que você escolher usar. A redução de tamanho aqui pode ser bastante dramática.

    
por 21.10.2013 / 13:42
1

Você pode usar os seguintes métodos para reduzir o tamanho do executável:

  • Certifique-se de que o executável seja compilado sem depurar os símbolos. Isso acontecerá se o seu makefile tiver o sinalizador -g presente em gcc opções de linha de comando. Normalmente, isso é padrão, porque permite depurar facilmente esse executável. Você pode usar o utilitário strip para remover os símbolos de depuração do executável existente. Muitas vezes, isso sozinho pode reduzir o tamanho do executável 2 ou mais vezes, às vezes até 10 vezes.
  • Compile todas as bibliotecas necessárias dinamicamente (especialmente C runtime library glibc no Linux). A compilação estática ( -s ) é boa para evitar dependências, mas é um preço que aumenta significativamente o tamanho do executável. Por exemplo, se o seu executável precisar de libxml2, adicione a linha de comando -lxml2 to gcc para vincular libxml2 dinamicamente. O lado negativo desta abordagem é que o seu executável irá travar se a biblioteca necessária não estiver instalada em seu sistema de destino (você deve certificar-se de executar sudo apt-get install libxml2 primeiro).
  • Ativar otimização por tamanho -Os . No entanto, os ganhos típicos são muito pequenos, raramente mais de 5% -10%.
  • Compacte seu executável usando upx (instale-o com sudo apt-get install upx-ucl ). upx suporta empacotamento não apenas para a plataforma Intel, mas para muitas outras plataformas, como arm, mips, powerpc, etc. Note que enquanto upx pode dar uma redução impressionante no tamanho (2x-5x), não deve ser usado cegamente. Ao contrário dos executáveis padrão, os compactados com upx não podem compartilhar as mesmas páginas de cache. Por exemplo, se o seu programa tiver 2MB de tamanho e você iniciar 100 cópias dele, ele consumirá apenas cerca de 2 MB de memória - o kernel reutilizará as páginas armazenadas em cache. Se você compactá-lo com upx para dizer 1 MB e iniciar 100 cópias, ele consumirá 200 MB de memória. No entanto, ele só precisará ler 1 MB do disco e isso reduzirá consideravelmente a hora de início da primeira cópia porque upx de descompactação é muito rápida (muito mais rápida do que a leitura do disco).
por 24.10.2013 / 08:08