Solaris Elfedit: Existe algo semelhante para o Linux? (um editor de biblioteca compartilhado)?
-
24-09-2019 - |
Pergunta
Linux: Existe uma maneira de editar uma biblioteca compartilhada compilada?
especificamente estou pesquisando sobre como adicionar o DT_SYMBOLIC flag
Em uma biblioteca compartilhada binária já compilada?
Aqui está por que estou perguntando isso:
Nosso aplicativo é composto de
- nossas próprias bibliotecas (estático libxxx.a)
- Alguns Libs de terceiros (Compartilhado apenas binário bibliotecas lybyyy.so)
Tudo está bem com o aplicativo até agora.
Agora eu substituí o nosso estático* bibliotecas libxxx.a com versões de bibliotecas compartilhadas (libxxx.so).
Tudo compila e links bem.
Mas quando eu execute o aplicativo agora, ele inicia e faz muito processamento esperado - e depois trava em algum lugar na metade do caminho. Um backtrace do GDB mostra que o acidente ocorre em algumas das bibliotecas compartilhadas de terceiros.
Eu procurei no SOF e encontrei um artigo interessante aqui.
A dica a que me refiro é
... add the DT_SYMBOLIC flag to the dynamic section ...
Embora eu duvide que isso realmente ajude, acho que vale a pena tentar.
Qualquer idéia de como posso adicionar o DT_SYMBOLIC flag
Em uma biblioteca compartilhada já compilada/vinculada?
meio Ambiente: Debian Lenny 64bit com G ++ v4.2.4 e Binutils V20.
EDITAR: em Solaris, há um programa chamado elfedit
. Existe algo semelhante para o Linux?
Solução
Enquanto isso, encontrei uma ferramenta chamada elfsh
. É um shell interativo para examinar e editar objetos ELF, binários e bibliotecas compartilhadas.
Veja aqui a página do projeto: http://www.eresi-project.org
Infelizmente, não parece ser muito estável. Eu experimentei muitos acidentes dentro elfsh
em si.
Outras dicas
Se for apenas uma bandeira, a abordagem dolorosa é ajustar seu cabeçalho de elfo com um editor hexadecimente.
Mas se a 3ª parte LIB estiver travando, eu pessoalmente olharia para o outro lado das coisas: o que mudou na ordem de carregamento da biblioteca por causa de você se mudar para compartilhado.
LDD
e
exportar ld_debug = libs
são seus amigos aqui.
Dlopen () ing suas bibliotecas compartilhadas depois que o carregador de tempo de execução carrega suas libs de terceiros pode ser suficiente.