Eu tenho exatamente o mesmo problema dessa pergunta postada anteriormente, onde /etc/ld.so.preload
não intercepta a arquitetura correta. Um pouco de fundo: eu compilei um objeto compartilhado (64 bits) que é referenciado no ld.so.preload
arquivo em qualquer execução binária. O problema era que eu estava recebendo um ERROR: ld.so: object '/usr/local/lib/mysharedobject.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
ao executar programas de 32 bits.
Para corrigir o problema de acordo com a resposta nessa pergunta, tive que criar dois diretórios ( lib/i386-linux-gnu
e x86_64-linux-gnu
, por exemplo, em /var/opt
) e especificar /var/opt/$LIB/mysharedobject.so
para /etc/ld.so.preload
que a biblioteca correta fosse pré-carregada dependendo da arquitetura do programa.
Então, nesse caso, em sistemas baseados em Debian, /var/opt/$LIB/mysharedobject.so
expandiria para:
/var/opt/lib/i386-linux-gnu/mysharedobject.so
para programas de 32 bits;/var/opt/x86_64-linux-gnu/mysharedobject.so
para programas de 64 bits.
No entanto, depois de aplicar isso, qualquer binário que eu executar (como ls
) produzirá o seguinte 'erro':
ERROR: ld.so: object '/var/opt/$LIB/mysharedobject.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
Como você pode ver, $LIB não se expandiu para nada. Também configurei e corri $LD_LIBRARY_PATH
para atualizar o sistema com essas libs, mas sem sucesso. Qual é o problema aqui?/var/opt
ldconfig
O shell expandiria
$LIB
, mas não foi possível quando você fez isso:A menção da página de manual
/etc/ld.so.preload
não menciona a possibilidade de expansões glob ou variáveis de ambiente:nem isso seria provável, quando você parasse para pensar em como os dados são usados:
Agora ... a página de manual menciona que
$LIB
pode ser usado em rpath eLD_PRELOAD
, mas também dizEssa é uma armadilha que afetaria você, pois
/var/opt
provavelmente não é um diretório de pesquisa padrão .Finalmente resolveu o problema.
$LIB
A variável de ambiente se expande para olib32
diretório para programas de 32 bits elib/x86_64-linux-gnu
para programas de 64 bits (como/usr/$LIB/mysharedlibrary.so
em/etc/ld.so.preload
) - conforme mostrado emstrace
. Isto é para sistemas baseados em Debian, já que para outros sistemas será expandido paralib64
elib
(pode sempre confirmar comstrace
, mais especificamente aopenat()
chamada de sistema).Portanto, a solução seria compilar a biblioteca compartilhada com
-m32
and-m64
e colocar os arquivos de arquitetura relevantes em suas respectivas pastas referenciadas de$LIB
.Em resumo (exemplo):