Pergunta

Eu quero dlopen() cada biblioteca compartilhada em um diretório específico.Para fazer isso,
o que é a maneira mais para recuperar linux caminho de busca da biblioteca.Ou existe uma maneira mais rápida de encontrar um diretório específico em que caminho ?
posix seria melhor.

Foi útil?

Solução

POSIX não suporta um mecanismo para descobrir os diretórios de biblioteca compartilhada do caminho de procura (não-mandato LD_LIBRARY_PATH, por exemplo), portanto, qualquer solução é inerentemente um pouco de plataforma específica.

O Linux apresenta alguns problemas, pois os valores a ser utilizada poderia ser baseada no conteúdo de /etc/ld.so.conf assim como qualquer valor de tempo de execução em LD_LIBRARY_PATH variável de ambiente;outros sistemas apresentam comparável problemas.Os locais padrão igualmente variar consoante o sistema - com /lib e /usr/lib sendo habitual para Linux de 32 bits máquinas, mas /lib64 e /usr/lib64 sendo usado em pelo menos algumas máquinas de 64 bits.No entanto, outras plataformas de utilizar outros locais para 64-bit do software.Por exemplo, o Solaris usa /lib/sparcv9 e /usr/lib/sparcv9, como , por exemplo, que o docs mencionar /lib/64 e /usr/lib/64, eles são ligações simbólicas para o sparcv9 diretórios).Solaris também tem variáveis de ambiente LD_LIBRARY_PATH_64 e LD_LIBRARY_PATH_32.HP-UX e AIX tradicionalmente utilizam outras variáveis que LD_LIBRARY_PATH -- SHLIB_PATH e LIBPATH, IIRC, apesar de acreditar AIX agora usa LD_LIBRARY_PATH muito.E, no Solaris, a ferramenta para configurar bibliotecas compartilhadas é 'crle' (configurar o tempo de execução de ligação de ambiente) e o análogo da /etc/ld.so.conf é /var/ld/ld.config ou /var/ld/64/ld.config.Também, é claro, as extensões de bibliotecas compartilhadas varia (.so, .sl, .dylib, .bundle, etc.).

Assim, sua solução será específicos da plataforma.Você precisa decidir sobre os locais padrão, as variáveis de ambiente para ler, e o arquivo de configuração para ler, e a extensão de arquivo relevante.Dado os, em seguida, é, principalmente, uma SMOP - Simples Questão De Programação:

  • Para cada diretório chamado por qualquer uma das fontes:
    • Abrir os respectivos sub-diretório (opendir())
      • Leia cada nome de arquivo (readdir()) no turn
      • Utilização dlopen() o caminho dos arquivos relevantes.
      • Fazer qualquer análise é relevante para você.
      • Utilização dlclose()
    • Utilização closedir()

Ver também as notas no comentário abaixo...completa tópico é modestamente, repleta de variações de plataforma para plataforma.

Outras dicas

Não tenho certeza se é possível fazer isso e ser portátil. Como essa questão é sobre o Linux, a portabilidade pode não ser de suma importância. Então eu não entendo a restrição do POSIX. Você poderia esclarecer?

Você provavelmente terá que implementar a funcionalidade de pesquisa detalhada em man 8 ld.so, que inclui a digitalização /etc/ld.so.conf, além de LD_LIBRARY_PATH, ou fazer /lib/ld.so Faça o que quiser para você e analise a saída. Uma linha de comando não muito bem-precurtária para isso poderia ser:

export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD

Você pode então enumerar arquivos com as chamadas POSIX opendir(3) e readdir(3).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top