As we know, any executable file, which is running, is loaded into RAM.
Errado!
um arquivo executável é mapeado no espaço de endereço virtual de processos executados, pelo virtual memory do kernel. A RAM física é gerenciada apenas pelo kernel. Leia Sistemas operacionais: três peças fáceis para saber mais.
Nem todo o segmento de código desse arquivo executável recebe paginado (não carregado! ) na RAM. Em particular, um grande pedaço de código que nunca é usado (por exemplo, porque contém alguma função grande que nunca é chamada) não irá para a RAM. Leia sobre o paging e a página cache .
Às vezes, não há RAM física suficiente para lidar convenientemente com todas as páginas necessárias. Nessa situação, você observa se debatendo .
o vinculador dinâmico (consulte ld-linux (8) ) e também dlopen (3) usa mmap(2) para mapear alguns segmentos da biblioteca compartilhada. Portanto, ele não carrega todo o segmento de código do plug-in na RAM. Leia também o documento Como escrever bibliotecas compartilhadas do Drepper
when we execute it and type always a, the dlopen will never be called, so mysofile will never be linked, which means that mysofile will never be loaded into RAM.
Há absolutamente de jeito nenhum em geral para prever quais bibliotecas compartilhadas futuras seriam usadas e dlopen
-ed. Pense nos dois cenários a seguir:
-
um programa de longa duração (talvez o seu navegador) pede ao seu usuário para obter alguma biblioteca compartilhada (talvez baixá-lo da rede) e então dlopen
it.
-
um processo está gerando algum código C em um arquivo temporário /tmp/emittedcode.c
, compila (por fork
um processo apropriado executando algum gcc -O -Wall -fPIC /tmp/emittedcode.c -shared -o /tmp/emittedcode.so
) esse arquivo em um plugin temporário /tmp/emittedcode.so
e dlopen
-s esse plugin temporário (claro que depois dlsym
-os símbolos apropriados lá).
Eu gosto muito da segunda abordagem. Observe que compilação para C é um hábito bem estabelecido. E os compiladores atuais são rápidos o suficiente para permitir que isso seja feito em alguma interação do REPL.
BTW, em um desktop Linux, um processo pode usar dlopen
muitos objetos compartilhados , isto é, plugins (pelo menos centenas de milhares e provavelmente milhões). Veja meu exemplo manydl.c
(que gera código C "aleatório" em arquivos temporários e repita).
PS. Esteja ciente também do Problema de Interrupção , relacionado à impossibilidade teórica de prever todos os caminhos dlopen
-ed futuros.