Pergunta

test.c:

int main()
{
    return 0;
}

Eu não usei nenhum bandeiras (eu sou um newb para gcc), apenas o comando:

gcc test.c

Eu tenho usado o mais recente TDM compilação do GCC em win32. O executável resultante é quase 23KB, grande demais para um programa vazio.

Como posso reduzir o tamanho do executável?

Foi útil?

Solução

Não siga suas sugestões, mas por causa de diversões, leia esta ' história ' sobre como fazer o menor possível binário ELF.

Outras dicas

Como posso reduzir o seu tamanho?

  • Não faça isso. Você apenas desperdiçando seu tempo.
  • Uso -s bandeira para símbolos de tira (gcc -s)

Por padrão algumas bibliotecas padrão (por exemplo, tempo de execução C) ligada com o seu executável. Confira chaves --nostdlib --nostartfiles --nodefaultlib para mais detalhes. opções de link descrito aqui .

Para a segunda opção de programa real é tentar opções de otimização , por exemplo, -OS (OPTIMIZE for tamanho).

desistir. No Linux x86, gcc 4.3.2 produz um binário 5K. Mas espere! Isso é com dinâmica ligando! O estaticamente binário vinculado é mais de meio meg: 516K. Relaxar e aprender a viver com o inchaço.

E disseram Modula-3 nunca iria a qualquer lugar por causa de um binário mundo 200K Olá!


No caso de você querer saber o que está acontecendo, a biblioteca GNU C é estruturado de modo a incluir determinadas características se o seu programa depende deles ou não. Esses recursos incluem tais curiosidades como malloc e livre, dlopen, algum processamento de corda, e um todo bucketload de coisas que parece ter a ver com locais e internacionalização, embora eu não possa encontrar nenhum homem páginas relevantes .

Criação de pequenas executáveis ??para programas que exigem serviços mínimos é não um objetivo do projeto para glibc. Para ser justo, ele também tem sido não a meta de design para todos os sistemas de tempo de execução que eu já trabalhei com (cerca de meia dúzia).

Na verdade, se o seu código não faz nada, não é mesmo justo que o compilador ainda cria um executável? ; -)

Bem, no Windows qualquer executável ainda teria um tamanho, embora possa ser pequeno razoável. Com o antigo sistema MS-DOS, uma completa aplicação que não faz nada seria apenas um par de bytes. (Eu acho que quatro bytes para usar a interrupção 21h para fechar o programa.) Então, novamente, os aplicativos foram carregados diretamente na memória. Quando o formato EXE tornou-se mais popular, as coisas mudaram um pouco. Agora executáveis ??tinha informações adicionais sobre o processo em si, como a deslocalização de segmentos de código e dados, além de alguns somas de verificação e informações sobre a versão. A introdução do Windows acrescentou outro cabeçalho para o formato, para dizer MS-DOS que não poderia executar o executável, uma vez que precisava para ser executado em Windows. E Windows iria reconhecê-lo sem problemas. Claro, o formato executável também foi ampliado com informações sobre recursos, como bitmaps, ícones e formas de diálogo e muito, muito mais.

A fazer-nada executável que hoje em dia estar entre 4 e 8 kilobytes de tamanho, dependendo do seu compilador e todos os métodos que você usou para reduzir o seu tamanho. Seria em um tamanho onde UPX seria realmente resultar em executáveis ??maiores! bytes adicionais no seu executável pode ser adicionado porque você adicionou algumas bibliotecas ao seu código. Especialmente bibliotecas com dados ou recursos inicializados irá adicionar uma quantidade considerável de bytes. Adicionando informações de depuração também aumenta o tamanho do executável.

Mas enquanto tudo isso faz um belo exercício em reduzir o tamanho, você pode se perguntar se é prático para apenas continuar a se preocupar com bloatedness de aplicações. discos rígidos modernos vai dividir arquivos em segmentos e para realmente grandes discos, a diferença seria muito pequeno. No entanto, a quantidade de problemas que seria necessário para manter o tamanho tão pequeno quanto possível vai abrandar a velocidade de desenvolvimento, a menos que você é um desenvolvedor especialista quem é usado para essas otimizações. Esses tipos de otimizações não tendem a melhorar o desempenho e considerando a média de espaço em disco da maioria dos sistemas, não vejo por que seria prático. (Ainda assim, eu faço otimizar meu próprio código de forma semelhante, mas, novamente, eu sou experiente com essas otimizações.)


interessado no EXE cabeçalho ? É começa com as letras MZ, para "Mark Zbikowski". A primeira parte é o cabeçalho de estilo antigo MS-DOS para executáveis ??e é usado como um esboço para o MS-DOS dizendo que o programa é não um executável MS-DOS. (No binário, você pode encontrar o texto 'Este programa não pode ser executado no modo DOS.', Que é basicamente tudo o que ele faz:. Exibindo a mensagem seguinte é o cabeçalho PE, que o Windows irá reconhecer e usar em vez do MS-DOS cabeçalho. Ela começa com as letras PE para portátil executável. Após este segundo cabeçalho haverá o próprio executável, dividido em vários blocos de código e dados. o cabeçalho contém tabelas de realocação especiais que conta a oS onde carregar um bloco específico. e se você pode manter isso para um limite, o executável final pode ser menor do que 4 KB, mas 90% seria, então, cabeçalho informações e nenhuma funcionalidade.

Eu gosto da maneira como o DJGPP FAQ destinatários da presente muitos anos atrás :

Em geral, a julgar tamanhos de código, olhando para o tamanho dos programas "Hello" não tem sentido, porque tais programas consistem principalmente do código de inicialização. ... A maioria do poder de todas estas características vai desperdiçado em programas de "hello". Não há nenhum ponto na execução de todo esse código apenas para imprimir uma seqüência de 15 bytes e sair.

Qual é o propósito deste exercício?

Mesmo com um preço tão baixo linguagem de nível um como C, ainda há um monte de configuração que tem que acontecer antes principal pode ser chamado. Alguns dos que a instalação é tratado pelo carregador (que necessita de determinadas informações), alguns é tratado pelo código que chama principal. E então há provavelmente um pouco de código da biblioteca que qualquer programa normal teria de ter. No mínimo, há provavelmente referências às bibliotecas padrão, se eles estão em DLLs.

Examinando o tamanho do binário do programa vazio é um exercício inútil em si. Diz-lhe nada. Se você quer aprender algo sobre o tamanho do código, tente escrever programas não-vazias (e de preferência não-triviais). programas comparar que usam bibliotecas padrão com programas que fazem tudo sozinhos.

Se você realmente quer saber o que está acontecendo no que binário (e por que é tão grande), e depois descobrir o formato executável obter uma ferramenta de despejo de binário e tomar a coisa à parte.

O que 'size a.out' dizer-lhe sobre o tamanho dos segmentos de código, dados e bss? A maioria do código é provável que seja o código de arranque (classicamente crt0.o em máquinas Unix) que é invocado pelo o / s e não criar trabalho (como triagem para fora argumentos de linha de comando para argc, argv) antes de invocar main().

Executar tira no binário para se livrar dos símbolos. Com gcc versão 3.4.4 (cygming especial) eu cair de 10k para 4K.

Você pode tentar vincular um tempo personalizado run (A parte que chama principal) para configurar o seu ambiente de tempo de execução. Todos os programas utilizam a mesma para configurar o ambiente de tempo de execução que vem com gcc, mas para o seu executável que você não precisa de dados ou memória zero'ed. Os meios que você poderia se livrar de funções da biblioteca não usados ??como memset / memcpy e reduzir o tamanho CRT0. Ao procurar informações sobre este olhada GCC no ambiente incorporado. desenvolvedores de sistemas embarcados são gerais as únicas pessoas que ambientes de execução uso personalizado.

O resto é overheads para o sistema operacional que carrega o executável. Você não vai mesmo muito lá a menos que você melodia que à mão?

Usando o GCC, compilar seu programa usando -Os em vez de um dos outros opções de otimização (-O2 ou -O3). Isto diz-lhe para otimizar o tamanho, em vez de velocidade. Aliás, às vezes pode fazer programas correr mais rápido do que as otimizações de velocidade teria, se algum segmento crítico acontece para caber mais bem. Por outro lado, -O3 pode realmente induzir a code-tamanho aumenta.

Também pode haver algumas bandeiras vinculador dizendo-lhe para deixar de fora código não utilizado do binário final.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top