Esconder símbolo (s) no objeto compartilhado de LD
-
22-07-2019 - |
Pergunta
Eu tenho duas bibliotecas de terceiros, ocasionalmente, ter o mesmo nome do símbolo exportado. Quando o executável é carregado, ld geralmente escolhe a pessoa errada e eu ficando acidente como resultado. Eu não posso fazer muito sobre o conteúdo dessas bibliotecas, então pode estar lá é uma maneira de instruir ld como encontrar o imlementation adequada?
OS - Solaris 10, o meu programa é construído por autoconf / autotools / gcc, bibliotecas conflitantes são libclntsh (parte do driver Oracle) e OpenLDAP. Unfortuinately, eu não posso usar a execução do cliente LDAP da Oracle - que carece de muitos recursos OpenLDAP tem
.Editado: A ligação é o seguinte: libclntsh.so-> A.so-> main <-B.so <-libldap_r.so
Solução
Se você não precisa de ligação em ambas as bibliotecas compartilhadas em tempo de compilação (que não é claro da sua pergunta), você pode usar -Bdirect
para a biblioteca compartilhada. Isto irá gravar para todos os símbolos da biblioteca compartilhada onde tinham sido encontrados; se, em seguida, em tempo de execução de um segundo definição das aparece símbolo (do outro biblioteca compartilhada), ele será ignorado.
Outras dicas
Uma solução é definir a variável de ambiente LD_PRELOAD
à biblioteca cujos símbolos devem ter precedência. (Se essa biblioteca tem compartilhado dependências da biblioteca de seu próprio país, você pode precisar para pré-carregar todas as suas dependências;. Apenas LD_PRELOAD
conjunto à lista de bibliotecas dependentes, separados por espaços)