Função dlsym 3 c

Função dlsym 3 c
“Linux criou muitas de suas funções únicas para executar tarefas de rotina. A função dlsym () é uma delas. O objetivo da função dlsym () é encontrar o endereço de um símbolo definido especificado em uma DLL (Dynamic Link Library) que foi acessível através de uma chamada de função dlopen (). Após o carregamento do arquivo dinâmico de objeto compartilhado (biblioteca de link comum) indicado pelo nome do arquivo de string terminado nulo, a função dlopen () produz uma "conexão" anônima para o objeto carregado. O símbolo nomeado é procurado na Biblioteca de Link Dinâmica (DLL) que foi buscada pelo método dlopen (). Neste artigo, falaremos sobre o uso de dlsym ().

Se o símbolo desejado não estiver presente nessa DLL, as DLLs dependentes dessa DLL serão pesquisadas, depois de qualquer dependência delas e assim foi pesquisado para esse propósito. Embora a sequência em que as DLLs dependentes no mesmo nível sejam pesquisadas não sejam determinadas, essa ordem de pesquisa determina como os símbolos de duplicação em DLLs distintos serão identificados. Esteja ciente de que as bibliotecas dinâmicas dependentes descarregadas não serão carregadas como conseqüência de um DLSYM () Pesquisar DLLs dependentes. Somente as DLLs que foram carregadas como um componente das DLLs dependentes da chamada dlopen () serão digitalizadas.”

Rtld_now: Se toda a coleção de DLLs dependentes dependerá ser disponibilizada para chamadas subsequentes para a função dlsym (), esse sinalizador é usado para invocar bibliotecas de link dinâmico.

Rtld_lazy: Quando usamos essa bandeira, não podemos descobrir quais bibliotecas de link dinâmicas dependentes são carregadas não é conhecida.

RTLD Global: Bibliotecas recém -carregadas podem usar os símbolos especificados por este pacote para determinação de símbolos.

Rtld_local: Como nenhuma das bandeiras é mencionada, este é o oposto do RTLD Global e o padrão.

Aqui está a sintaxe do comando dlsym ():

#incluir
# void *dlsym (void *__ RESTRITT__ Handler, const char *__ restrito__ símbolo_name);

O arquivo de cabeçalho onde a função dlsym () é definida é . "Symbol_name" é a sequência de personagens que é uma representação do nome do símbolo, e "Handler" é o valor obtido por uma chamada para dlopen () (que ainda não foi retornada pela solicitação para dlclose ()).

O valor nulo é retornado, se a alça não apontar para uma DLL apropriada que foi aberta por dlopen (). O valor nulo é retornado pela função dlsym () se nenhum DLL vinculado ao manipulador corresponde ao símbolo nomeado (nome do símbolo).

Crie o DLSYM.Arquivo C usando o editor Vim ou qualquer editor de sua escolha, que pode incluir nano etc.

Escreva o código fornecido na tela abaixo para o arquivo C criado na etapa anterior. Os arquivos do cabeçalho estão incluídos nas quatro primeiras linhas de código no código de exemplo abaixo. Depois disso, a função principal é lançada e, dentro da função principal, um ponteiro do manipulador do tipo de vazio é criado. A linha de código anterior declara um ponteiro codificado pelo caractere do tipo vazio.

Usando isso, invocamos o método DLopen e fornecemos a bandeira preguiçosa RTLD junto com a localização do .Portanto, o arquivo (que é um arquivo compartilhado dinâmico no Linux). A variável manipuladora manterá os resultados do DLOPEN. Ao retornar 1, a próxima linha determina se o dlopen carregou com sucesso a biblioteca de link dinâmica. No caso de uma falha, o erro foi escrito na tela e a função principal foi encerrada.

Após a expressão condicional, agora chamamos o método dlerror () para corrigir o erro existente. Assim que adicionarmos 1 ASCII inteiro ao símbolo codificado do tipo de personagem que definimos, ele terá o valor “coloca.”O comprimento da corda foi calculado na próxima linha e salvo na variável de comprimento codificado, que foi então empregado no loop for usado para decodificar. Usamos o símbolo final “0” para encerrar o código após o loop for. Depois disso, executamos o método dlsym (), passando o manipulador e os parâmetros de código decodificado, e a variável de saída incluiu os resultados.

Ao invocar a função dlsym () para compilar um arquivo C, o processo de compilação em um compilador C difere de um comando de compilação padrão. Você criaria o programa usando o seguinte comando se estivesse em um arquivo chamado “DLSYM.C ”:

$ gcc -rdynamic -o foo dlsym.C -LDL

Após uma compilação bem -sucedida, o arquivo de saída é criado e dado o nome DLSYM.fora. Basta entrar no comando./dlsym.fora e pressione a tecla Enter para executar o arquivo de saída. A saída do arquivo será exibida na tela do terminal em um sistema operacional semelhante ao UNIX ou Linux.

Usando o editor do VIM, fizemos um pequeno ajuste nas últimas linhas de códigos do arquivo C. A declaração de impressão no final da função principal deve ser substituída pela saída, que foi transformada na função de puts. Nas marcas de cotação dupla da tela, o texto foi adicionado.

Agora compile o código novamente e veja a saída na tela do terminal; Sem usar a instrução de impressão, obtemos a saída na tela usando nosso valor de saída que é alterado para a função Puts. Aqui está a saída deste arquivo de código específico mostrado acima.

Conclusão

Dentro do parágrafo introdutório deste artigo, discutimos o uso da função DLSYM () 3 C para descobrir o endereço de algum símbolo definido especificado na DLL. Discutimos e elaboramos dois exemplos claros de C no sistema operacional Kali Linux para este. Ambos os exemplos são muito simples, mas muito eficientes simultaneamente e demonstram o uso do dlsym () funcionam muito claramente para uma melhor compreensão.