For a library loaded by a shared object, how do I allow versioned symbols to be resolved by the executable?
Existe uma biblioteca proprietária usada por muitos executáveis em um sistema que possui um bug em uma rotina que precisamos corrigir em todo o sistema. Isso faz com que algo como LD_PRELOAD seja incômodo e pouco prático para forçar a entrada em todos os ambientes dos quais esses executáveis podem ser ativados. Assim, o plano que me foi dado foi copiar digamos libspecial.so
para libspecial.so.org
e criar uma nova biblioteca chamada libspecial.so
, que substitui essa função e está vinculada a libspecial.so.org
para permitir que todos os símbolos restantes sejam carregados automaticamente. / p>
Em um pequeno teste com uma pequena biblioteca de exemplos, isso funcionou bem.
A única função é substituída e todos os outros símbolos na biblioteca original estão disponíveis para o executável principal de forma transparente.
No entanto, a biblioteca em questão tem alguns símbolos com versão. Por algum motivo, essas informações não são transmitidas e o executável reclama (bem, o vinculador de tempo de execução) que ele não pode procurar as informações de versão necessárias.
Como posso permitir que símbolos com versão sejam resolvidos pelo executável?
Talvez, se eu carregar explicitamente a biblioteca com o dlopen, existam algumas sinalizações especiais para permitir isso?
Ou há uma maneira mais fácil?
Um colega sugeriu que poderíamos recorrer à remoção de todas as informações necessárias da versão das estruturas executáveis do ELF, as quais tentamos e funcionam. Mas então eu preciso mudar todos os executáveis, e também há a preocupação de que isso possa quebrar algo, então parece muito arriscado. Como o vinculador de tempo de execução pode manipular a resolução dos símbolos e está apenas sendo desconectado ao passar as informações da versão, espero que esteja perdendo uma maneira de lidar facilmente com isso na biblioteca.
Tags linux shared-libraries elf