Sistema Dlopen Linux em C

Sistema Dlopen Linux em C
A função da biblioteca dlopen () é uma função muito útil na linguagem C. A função carrega a biblioteca na memória depois de abrir uma nova. Geralmente o usamos para carregar os símbolos da biblioteca que são desconhecidos no momento da compilação. Dlopen () é uma função usada em nossos programas. A biblioteca DL implementa DLopen (), definida em DLFCN.h. Dois parâmetros são necessários para a função dlopen: o nome do arquivo da biblioteca e o sinalizador. O nome do arquivo é uma biblioteca dinâmica e define se as dependências da biblioteca são ou não calculadas imediatamente. O dlopen () retorna um "identificador" que deve ser considerado como um valor opaco e outras operações da biblioteca de DL usam isso. Se a tentativa de carregar não for bem -sucedida, o dlopen () retorna nulo. Mas o dlopen () retorna a mesma alça de arquivo se carregar a mesma biblioteca muitas vezes.

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 ().

#incluir
#incluir
#incluir
#incluir
int
principal (int argc, char ** argv)

alça de vazio *;
duplo (*seno) (duplo);
char *erro;
handle = dlopen (libm_so, rtld_lazy);
se (!lidar)
fprintf (stderr, "%s \ n", dlerror ());
saída (exit_failure);

dlerror ();
*(void **) (& seno) = dlsym (alça, "sin");
if ((Error = DLERROR ()) != Null)
fprintf (stderr, "%s \ n", erro);
saída (exit_failure);

printf ("%f \ n", (*seno) (4.0));
dlclose (alça);
saída (exit_success);

Usamos 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.

#incluir
#incluir
#incluir
#incluir
int main (vazio)

char* src = "hello linux";
int ( *strlen) (const char *);
alça de vazio *;
char *erro;
alça = dlopen ("./libtr.Então ", rtld_lazy);
erro = dlerror ();
se(!alça || erro != Null) printf ("A tentativa de biblioteca de carregamento falhou!\ n%s \ n ", erro);
retornar -1;
strlen = dlsym (alça, "strlen");
erro = dlerror ();
se(!strlen || erro == null) printf ("%s \ n", erro); retornar -1;
printf ("O comprimento da string é:%d \ n", strlen (src));
dlclose (alça);
retornar 0;

Usamos 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.