Quando é necessária a biblioteca dinâmica [duplicada]

0

Foi-me dito que a biblioteca dinâmica é boa porque pode salvar a RAM, só é necessária enquanto o programa está sendo executado.

Agora eu tenho uma pergunta: se um programa pode ser executado, posso dizer que todas as bibliotecas dinâmicas que ele precisa estão lá (não haveria nenhum erro de falta de biblioteconomia dymanic)?

Digamos que um programa seja proveniente de um link de três arquivos .o e cada arquivo .o precise de uma biblioteca dymanic. Se eu remover uma biblioteca dinâmica, ainda posso fazer o programa rodar?

Como eu sei, temos duas maneiras de carregar uma biblioteca dinâmica:

  1. Carregue uma biblioteca dinâmica quando vinculamos arquivos objeto, por exemplo, g++ a.cpp -ltest , aqui vinculamos a biblioteca dinâmica libtest.so ao nosso programa, se removermos o libtest.so , não poderíamos executar o programa

  2. Carregue uma biblioteca dinâmica com a função api do sistema: dlopen . Neste caso, pelo que entendi, se a execução do programa não toca no código de dlopen , não teríamos nenhum erro.

Se eu estiver correto, posso dizer se a execução do programa não tem erro, significa que todas as bibliotecas dinâmicas de que ele precisa estão definitivamente disponíveis?

    
por Yves 17.04.2018 / 03:43

1 resposta

1

Isso basicamente depende se as bibliotecas dinâmicas são carregadas na inicialização do programa (que seria o comportamento normal com ld.so) ou preguiçosamente quando o código que precisa delas é executado primeiro. No primeiro caso, o programa terminará com um erro muito cedo. No segundo caso, pode não executar o código que precisa da biblioteca dinâmica e ser executado com êxito. Um exemplo do segundo caso seria um programa de processamento de arquivos de áudio que carrega codecs de áudio dependendo do tipo de arquivo. Se você não tiver um codec de mp3 instalado, ele ainda poderá funcionar com outros tipos de arquivo. (O comentário de muru aponta para uma questão em que isso é discutido mais profundamente)

    
por 17.04.2018 / 07:31