Qualquer mão-de exercício para entender como um programa é carregado na memória e são executados

StackOverflow https://stackoverflow.com/questions/1210522

  •  06-07-2019
  •  | 
  •  

Pergunta

Estou curioso sobre as coisas que aconteceu antes de main () é chamado, tais como carga o executável na memória, carga dinâmica de biblioteca compartilhada. Você tem alguma sugestão como entender essas coisas por uma mão-de exercício?

As ferramentas amd coisas que eu conheço, e usando agora, inclui:

  • strace
  • desmontar
  • readelf
  • / proc / pid / map

NOTAS: Eu sei que o grande livro ligadores e carregados , mas mãos- em exercício pode me ensinar melhor do que ler o livro.

Foi útil?

Solução

  • homem documentos várias variáveis ??de ambiente que pode ser ajustado para ajustar a dinâmica processo de ligação ou fornecer detalhes adicionais.

por exemplo.

LD_DEBUG=all cat </dev/null
  • Você pode facilmente obter o código fonte para todos e cada pedaço envolvidos - Linux kernel, vinculador dinâmico, biblioteca C, o código de inicialização (crt0.o ou similar). Você poderia começar por estudar o código e fazer modificações experimentais.

Outras dicas

Se você quiser verificar como um binário é embalado e as diferentes secções que eu acho que o melhor programa lá fora, é objdump .

Escolha qualquer executável e fazer:


objdump -S <executable>  > myfile.S

Outro bom exercício será:

  • Cria um programa que usar uma biblioteca externa
  • Compilar o programa usando vinculação estática
  • Execute o programa
  • Renomeie o arquivo de biblioteca e verifique se o programa é executado
  • compilar o programa usando a biblioteca compartilhada
  • Mudar o nome da biblioteca e verificar se o programa é executado

Isso vai responder algumas de suas perguntas sobre o que está acontecendo sob as cortinas e como.

Eu encontrei dois links relacionados interessantes (pelo menos para Linux) e um pouco menor do que o livro mencionado (ligadores e carregados)

Quando eu tomei uma classe de OS na faculdade, usamos Nachos . Não é um sistema operacional per se , mas uma espécie de sistema operacional "simulação" que é executado no espaço do usuário. Ele é escrito em C ++ e você pode cross-compilação executáveis ??que Nachos pode então carregar e executar. Você pode jogar com a interface chamada de sistema e na experiência geral, tanto quanto você gosta, girando com o código.

Nós correu em um laboratório Solaris, e eu tive alguns problemas começá-lo instalado e funcionando em Linux na minha máquina pessoal, mas pode ser um brinquedo divertido se você está disposto a cavar em algum código.

Eu percebo que é provavelmente muito para o que você está procurando, mas escrever o seu próprio montador e ligador seria muito educativo. Eu fiz isso quando eu estava na faculdade e adorei. Levou talvez 120 horas de trabalho pelo que me lembro de fazer o trabalho para as coisas básicas que eu queria fazer. Acho que este projeto mais do que qualquer outra coisa me fez ter certeza de que uma carreira na programação era para mim.

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