
Bom dia;
Depois de trabalhar na configuração de um servidor proxy LDAP para replicar dados LDAP, recebo a seguinte mensagem:
52a0b5ca send_ldap_result: conn=-1 op=0 p=3
52a0b5ca send_ldap_result: err=32 correspondido="" text=""
52a0b5ca ==> ldap_back_add("dc=basecorp,dc=net")
52a0b5ca =>ldap_back_getconn: conexão 0x7f40ea0 buscada refcnt=1.
/usr/libexec/slapd: erro de pesquisa de símbolo: /usr/libexec/openldap/back_ldap-2.4.so.2: símbolo indefinido: ldap_add_ext
Isso ocorre com o OpenLDAP 2.4.37 em um host Solaris 10 x86 e também em um host RedHat 5.5. Ambos são instalados a partir de fontes, incluindo a distribuição BDB mais recente. sourceserver é a máquina da qual desejo extrair dados e sincronizar com destserver (veja as configurações abaixo).
Então, a única coisa que as duas máquinas nas quais tentei executar o proxy têm em comum sou eu (ugh!). O problema é que configurei o proxy ao contrário? Talvez eu não tenha permissão para adicionar uma entrada a um back-end LDAP? Esperançosamente, um de vocês pode examinar minhas configurações abaixo e responder à minha pergunta, assim como a muitas outras por aí.
Meu slapd.conf para o proxy:
database ldap
hidden on
suffix "dc=basecorp,dc=net"
rootdn "cn=Manager"
uri ldaps://destserver01.dest.net:636
lastmod on
acl-bind bindmethod=simple
binddn="cn=Manager"
credentials=mypassword
syncrepl rid=500
provider=ldaps://sourceserver01.dest.net:636
binddn="cn=Manager"
bindmethod=simple
credentials=mypassword
searchbase="dc=basecorp,dc=net"
filter="(objectClass=*)"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="5 5 300 5"
overlay syncprov
Por último, permita-me jogar lama na água:
Eu usei nm:
[root@buildtest01 ~]# nm /usr/libexec/openldap/back_ldap-2.4.so.2 | grep ldap_add
U ldap_add_ext
E aí está o meu símbolo que falta. Com!?
Responder1
Como presumido @c4f4t0r, você (ainda) não está tendo problemas de configuração - você está tendoconstruir problemas relacionados.
DR:não use back-ends dinâmicos, eles estão quase sempre quebrados, a menos que você mexa no processo de construção. Pule para a atualização abaixo para ver os detalhes horríveis...
Você provavelmente possui bibliotecas LDAP antigas ou não OpenLDAP nos locais padrão do sistema. Não acredito que o configure
script seja inteligente o suficiente para testar essa condição ou que o processo de construção seja suficientemente robusto para lidar com ela. Por exemplo, se um antigo libldap.so
for encontrado em um local da biblioteca do sistema, ele será usado em preferência ao correto e instalado recentemente libldap.so
em tempo de execução. Correr ldd
contra back_ldap-2.4.so
deve mostrar isso.
Você pode consertar isso (sem reconstruir) adicionando o diretório relevante à variável de ambiente LD_LIBRARY_PATH
para que o diretório com as bibliotecas OpenLDAP mais recentes seja pesquisado primeiro (certifique-se de usar export
a variável).
Ou corrija-o (de preferência) no momento da compilação, executando configure
com a LDFLAGS
variável de ambiente definida com umRPATH
que codificará um caminho de pesquisa de biblioteca nos binários que você construir.
Você não forneceu suas configure
opções ou caminho de instalação, etc. Usei variações disso no passado:
export LDFLAGS="-L/usr/local/ssl/lib -Wl,-rpath,/usr/local/ssl/lib"
no caso em que eu queira usar um OpenSSL que não seja do sistema, o mesmo se aplica ao uso de uma versão do BerkeleyDB que não seja do sistema. No Solaris, você pode precisar usar "-R" em vez de "-rpath" (se estiver usando gcc
o vinculador Sun em vez do vinculador GNU):
export LDFLAGS="-L/usr/local/ssl/lib -R/usr/local/ssl/lib"
No seu caso, você provavelmente só precisa definir o rpath ( -Wl,-rpath
ou -R
), não -L
(embora eu recomende usar ambos quando para os casos de OpenSSL e BerkeleyDB).
AtualizarVocê está construindo com:
/configure --prefix=/usr --sysconfdir=/etc --enable-slapd --enable-crypt \
--enable-modules --enable-bdb=mod --enable-hdb=mod --enable-ldap=yes \
--enable-perl=mod --enable-overlays=mod --with-tls --with-gnu-ld
Observação " --enable-ldap=yes
",isso constrói o back-end LDAP estaticamente emslapd
, ele não cria um carregável dinamicamente back_ldap.so
(ou seja --enable-ldap=mod
, ). Uma possibilidade é que você tenha um arquivo perdido back_ldap.so
que está tentando carregar em seu servidor e um arquivo moduleload back_ldap
. No entanto, slapd
não permitirá que você carregue um módulo dinâmico quando existir um módulo estático com o mesmo nome, portanto, seu slapd
binário não parece ser como você descreveu.
Execute slapd -VVV
para confirmar back-ends estáticos.
Supondo back_ldap
que seja estático, você poderá solucionar esse problema e remover qualquer erro moduleload
e obsoleto .so
para garantir.
eu tenho umfortesuspeita que haja algum libtool, erro de dependência ou problema de vinculador escondido aqui. Posso reproduzir isso com um back_ldap dinâmico. ldap_add_ext
é de fato um símbolo não resolvido que não é necessariamente um problema (devido ao explícito dlopen()
para módulos), mas esse símbolo não é exportado por slapd
. Istoéexportado por libldap.so
, mas isso não é uma dependência back_ldap.so
e nada mais faz com libldap
que seja carregado. (Isso também significa que o conselho que dei acima não resolverá o problema, pois não é tão simples quanto um problema de caminho de biblioteca.)
O que está acontecendo (ou seja, o erro que você está vendo) é que o símbolo ldap_add_ext
não está sendo resolvido até que seja necessário (ligação "preguiçosa"). Quando você tenta adicionar um objeto LDAP, ele é finalmente necessário, é claro. Então as rodas saem. (Se você sentir vontade, poderá interrompê-lo no horário de início, exportando, LD_BIND_NOW=1
o que desativa a ligação preguiçosa e, em seguida, start slapd
, embora as chances sejam de que um símbolo diferente o desative.)
No momento, a opção mais simples é trabalhar com um static back_ldap
( --enable-ldap=yes
e talvez make clean && make depend && make install
ter certeza de que slapd
está construído corretamente). Uma opção menos simples é usar para contornar o problema da dependência e cruzar os dedos esperando que isso não tenha alguns efeitos colaterais estranhos.LD_PRELOAD=/usr/lib/libldap.so
LD_PRELOAD=/usr/lib/libldap_r.so
OK, este e-mail antigo cobre o problema:http://www.openldap.org/lists/openldap-software/200211/msg00469.html
slapd
está vinculado a uma estática libldap_r.a
por padrão,isso limita os símbolos que estarão disponíveis para aqueles conhecidos no momento do link. Como os módulos dinâmicos são carregados em tempo de execução com dlopen()
o vinculador não há visibilidade de seus requisitos (símbolos/bibliotecas).
Pode-se razoavelmente concluir que a construção dinâmica de (alguns) back-ends está praticamente interrompida há algum tempo.
Portanto, não use back-ends dinâmicos (recomendado) ou falsifique a construção (não tão recomendado) com algo como:
make depend && make
rm servers/slapd/slapd
LTSTATIC="" make -e # alternative to editing the Makefile
make install
Isso se vincula slapd
ao que libldap_r.so
você acabou de criar em vez do .a
, para que todos os símbolos possam ser carregados quando necessário (também diminui slapd
cerca de 15% no disco). Não executei um servidor LDAP operacional com isso, YMMV. Deve haver algumas soluções semelhantes ou alternativas usadas pelas distros...
Responder2
Este não é um problema de configuração, o erro é claro, está dizendo que o openldap está procurando uma função na biblioteca /usr/libexec/openldap/back_ldap-2.4.so.2 que não existe.
No redhat 5, por que você não usa o ldap padrão no formato rpm?