Tenho um executável antigo que está programado para a pilha de sucata, mas ainda não está lá. Ele depende de algumas bibliotecas que foram removidas do meu ambiente, mas eu tenho algumas bibliotecas stub em algum lugar onde funciona bem. Eu gostaria de apontar este executável para essas libs stub. Sim, eu poderia definir LD_LIBRARY_PATH, mas este executável é chamado de muitos scripts e muitos usuários e eu adoraria corrigi-lo em um local.
Não tenho fonte para isso e seria difícil obtê-la. Eu estava pensando - posso editar este arquivo, usando um editor compatível com ELF, e adicionar um PATH simples ao rpath para que ele chegue às novas bibliotecas? Isso é possível ou, depois de criar um binário ELF, você conserta as coisas em locais e elas não podem ser movidas?
Respostas:
Existe uma ferramenta chamada
chrpath
que pode fazer isso - provavelmente está disponível nos pacotes de sua distribuição.fonte
install_name_tool
pode fazer isso com o-rpath
sinalizador<binary>: no rpath or runpath tag found.
chrpath
patchelf
patchelf --set-rpath /path/to/libaries <binary>
Existe uma ferramenta mais universal do que a
chrpath
chamadapatchelf
. Ele foi originalmente criado para uso na criação de pacotes para Nix e NixOS (sistema de empacotamento e uma distribuição GNU / Linux).Caso não haja rpath em um binário (aqui chamado de rdsamp),
chrpath
falha:Por outro lado,
consegue muito bem.
fonte
patchelf
é capaz de adicionar um rpath a um binário que ainda não contém um rpath - ondechrpath
apenas parece ser capaz de modificar uma entrada já presente.rpath
erunpath
. Basicamente, um pode cancelarLD_LIBRARY_PATH
e o outro não. Para obter detalhes, consulte blog.tremily.us/posts/rpathchrpath
epatchelf
são desleixados com sua terminologia. Por exemplo, opatchelf
comando mostrado acima mudará,runpath
mas não arpath
menos que você também forneça a--force-rpath
opção.patchelf
explica: "--set-rpath
,--shrink-rpath
e--print-rpath
agora preferemDT_RUNPATH
maisDT_RPATH
, que é obsoleto Quando a atualização, se ambos estiverem presentes, ambos são atualizados Se apenas DT_RPATH está presente, ele é convertido para..DT_RUNPATH
A não ser que--force-rpath
seja especificado Se nenhum estiver presente. , aDT_RUNPATH
é adicionado a menos que--force-rpath
seja especificado, caso em que aDT_RPATH
é adicionado. " O nome da opção provavelmente foi mantido inalterado por motivos de compatibilidade.Assim como @ user7610 disse, o caminho certo é a
patchelf
ferramenta.Mas sinto que posso dar uma resposta mais abrangente, abrangendo todos os comandos necessários para fazer exatamente isso.
Para um artigo completo sobre o assunto, clique aqui
Em primeiro lugar, muitos desenvolvedores falam
RPATH
, mas eles realmente querem dizerRUNPATH
. Essas são duas seções dinâmicas opcionais diferentes e o carregador as trata de maneiras muito diferentes. Você pode ler mais sobre a diferença entre eles no link que mencionei antes.Por enquanto, lembre-se:
RUNPATH
estiver definido,RPATH
é ignoradoRPATH
está obsoleto e deve ser evitadoRUNPATH
é preferido porque pode ser substituído porLD_LIBRARY_PATH
Veja o R [UN] PATH atual
Limpe o R [UN] PATH
Notas:
RPATH
eRUNPATH
Adicione valores a R [UN] PATH
Notas:
<desired-path>
é uma lista de diretórios separados por vírgulas, por exemplo:/my/libs:/my/other/libs
--force-rpath
, defineRPATH
, caso contrário, defineRUNPATH
fonte
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
conjuntosDT_RUNPATH
, e é o que a maioria das pessoas deve usar.RUNPATH
pode ser substituído porLD_LIBRARY_PATH
, portanto, as pessoas não devem usar--force-rpath
.<desired-path>
usa dois-pontos; deve ser uma vírgula (ou seja:)/my/libs,/my/other/libs
.Isso funcionou para mim, substituindo XORIGIN por $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
fonte