Enquanto utiliza a função DLOPEN, o compilador não examina possíveis erros, pois não tem conhecimento dos tipos e protótipos que estamos usando. A implantação da função DLopen para carregamento padrão não parece ser promovida por ela, exceto por algumas situações menores. A propósito, é uma abordagem para melhorar a introspecção. Quando o módulo compartilhado está sendo utilizado atualmente por outro programa, a otimização do layout da memória não está particularmente interessada em carregar condicional. A pegada de memória não aumenta quando uma biblioteca usada anteriormente é carregada. Evitar o monitoramento do compilador é perigoso e contribui para uma boa redação de insetos. Além disso, não temos a possível otimização do compilador.
Exemplo 1:
Agora, considere o exemplo a seguir para ver a funcionalidade da função dlopen na linguagem C. Na primeira etapa, carregamos algumas bibliotecas padrão C. Aqui, carregamos a nova biblioteca “DLFCN.H ”que é usado para definir as macros enquanto construía o argumento do modo dlopen.
Em seguida, apresentamos outra biblioteca dentro do nosso programa “GNU/lib-name.h ". Os arquivos de biblioteca compartilhados incluídos no GNU libc são encontrados pelos programas de usuário de acordo com as macros que ele define. A biblioteca GNU C oferece as bibliotecas fundamentais para os sistemas operacionais GNU e GNU/Linux, bem como uma ampla gama de outros sistemas baseados em Linux. Depois disso, temos a implementação principal do método. Dentro disso, declaramos o objeto de ponteiro "manuseio" com a palavra -chave vazia. Declaramos uma função seno de ponteiro que tem o tipo de dados duplo. Há outra declaração do objeto de ponteiro "erro" para manuseio de erros.
Depois disso, invocamos a função dlopen dentro do objeto "Handle". O dlopen leva dois argumentos: libm_so e "rtld_lazy". Aqui, "libm_so" é o nome do arquivo de biblioteca que fornece funções matemáticas como funções trigonométricas. Esta biblioteca compartilhada é necessária à medida que usamos a função seno. O "rtld_lazy" é outro argumento que chama a função dlopen. Quando um determinado símbolo é referenciado pela primeira vez, as realocações devem ser realizadas em um momento determinado pela implementação.
Como um processo pode não fazer referência a todos os símbolos em um arquivo de objeto executável, a especificação do RTLD preguiçoso deve melhorar o desempenho nas implementações que permitem a ligação do símbolo dinâmico. Em seguida, temos uma condição IF-Else para manuseio de erros quando o objeto de manipulação falha ao executar a função dlopen. Chamamos o dlerror para limpar o erro.
A função dlerror () fornece uma string terminada nula que é legível por humanos e especifica o relato do erro recente causado por uma chamada para uma das chamadas da API do DLOPEN desde a última chamada do DLERROR. Em seguida, lançamos a função como esta: “(*void **) (& seno) = dlsym (alça, pecado)”. Como isso é estranho, o elenco está em conformidade com a ISO C, que evita avisos do compilador. Empregamos a função DLSYM, que obtém o caminho de um símbolo especificado dentro de um módulo de link dinâmico que é acessível através de uma função dlopen ().
Além disso, realizamos a operação if-else novamente para o erro padrão que é gerado quando o dlerror () não é nulo. Em seguida, temos uma instrução PRINTF onde especificamos o valor seno a ser calculado. Na última etapa, fechamos esse objeto compartilhado invocando o dlclose para a alça devolvida pelo dlopen ().
#incluirUsamos a opção -ldl com o comando de compilação C, pois esta é a biblioteca para a interface vinculada ao DLOPEN e é necessário. Quando a execução do arquivo dlopen é feita, ele exibe o valor seno do valor anteriormente dado.
Exemplo 2:
Agora, tomamos outro exemplo de uso da função dlopen. Carregamos nosso programa com todas as bibliotecas C necessárias para a implementação do Código DLOPEN. Então, começamos nosso programa dentro do método principal. Aqui, definimos a string com a declaração da variável "src". Em seguida, declaramos as variáveis do ponteiro "Strlen", "Handle" e "Error".
Em seguida, chamamos a variável de manipulação e implantamos a função DLopen. A função DLopen insere a biblioteca compartilhada “Libstr.Então ”para funções de manuseio de strings e o sinalizador“ rtld_lazy ”, que já está demonstrado no exemplo anterior. Invocamos a função dlerror dentro da variável "erro" para limpar o erro gerado pela função dlopen. O if-else é utilizado para examinar os erros.
Em seguida, obtemos o endereço da função Strlen usando a função DLSYM e verificamos os erros ao fazer isso. Depois disso, usamos a função Printf para chamar a função strnlen para retornar o comprimento da string fornecida. No final, fechamos a biblioteca compartilhada com a função dlclose.
#incluirUsamos o seguinte comando para a execução do programa fornecido. Aqui, a bandeira -lstr é usada para a função de comprimento da string e o LDL é usado para o arquivo de biblioteca DLopen. O programa compilado fornece o comprimento da string, como mostrado no shell:
Conclusão
As informações são fornecidas sobre a função dLopen da linguagem C neste artigo. Temos uma breve introdução da função dlopen. Então, implementamos dois exemplos. A função retorna um identificador que define a biblioteca aberta. Os endereços das funções dentro da biblioteca aberta são então determinados usando esse identificador e a função DLSYM. O endereço de uma função em uma biblioteca que já foi aberta usando DLopen pode ser encontrada usando a função DLSYM.