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

Foi útil?

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)

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