Me deparei com uma referência a ele recentemente sobre proggit e (a partir de agora) não está explicada.
Eu suspeito que isso poderia ser ela, mas eu não sei ao certo.
c
linux
environment-variables
Hank Gay
fonte
fonte
Respostas:
Se você definir
LD_PRELOAD
o caminho de um objeto compartilhado, esse arquivo será carregado antes de qualquer outra biblioteca (incluindo o tempo de execução Clibc.so
). Portanto, para executarls
com suamalloc()
implementação especial , faça o seguinte:fonte
LD_PRELOAD
. O motivo é que, sendo uma variável de ambiente, é herdada por processos filhos - que podem ter um diretório de trabalho diferente do processo pai. Portanto, qualquer caminho relativo falharia em localizar a biblioteca para pré-carregar.Você pode substituir símbolos nas bibliotecas de estoque criando uma biblioteca com os mesmos símbolos e especificando a biblioteca em
LD_PRELOAD
.Algumas pessoas o usam para especificar bibliotecas em locais fora do padrão, mas
LD_LIBRARY_PATH
são melhores para esse fim.fonte
Com
LD_PRELOAD
você pode dar precedência às bibliotecas.Por exemplo, você pode escrever uma biblioteca que implemente
malloc
efree
. E carregando-os com oLD_PRELOAD
seumalloc
efree
será executado em vez dos padrões.fonte
calloc
? isso não estragaria tudo?malloc
e grátis são projetados especificamente na glibc para permitir que isso e o estoquecalloc
consigam ligar para o importadomalloc
. Não tente fazer isso com outras funções. Não vai funcionar tão bem.Como muitas pessoas mencionaram, usando
LD_PRELOAD
para pré-carregar a biblioteca. BTW, você pode VERIFICAR se a configuração está disponível porldd
comando.Exemplo: suponha que você precise pré-carregar o seu próprio
libselinux.so.1
.Portanto, defina seu ambiente de pré-carregamento:
Verifique sua biblioteca novamente:
fonte
LD_PRELOAD
lista bibliotecas compartilhadas com funções que substituem o conjunto padrão, da mesma forma/etc/ld.so.preload
que. Estes são implementados pelo carregador/lib/ld-linux.so
. Se você deseja substituir apenas algumas funções selecionadas, pode fazer isso criando um arquivo e uma configuração de objeto de substituiçãoLD_PRELOAD
; as funções neste arquivo de objeto substituirão apenas as funções deixando as outras como estavam.Para obter mais informações sobre bibliotecas compartilhadas, visite http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
fonte
Aqui está uma postagem detalhada do blog sobre pré-carregamento:
https://blog.cryptomilk.org/2014/07/21/what-is-preloading/
fonte
é fácil exportar
mylib.so
para env:desabilitar :
fonte
unset LD_PRELOAD
Quando LD_PRELOAD é usado, esse arquivo será carregado antes de qualquer outra
$export LD_PRELOAD=/path/lib
lib ser pré-carregada, mesmo que isso também possa ser usado em programasfonte
Usando o
LD_PRELOAD
caminho, você pode forçar o carregador de aplicativos a carregar o objeto compartilhado fornecido, sobre o padrão fornecido.Os desenvolvedores usam isso para depurar seus aplicativos, fornecendo versões diferentes dos objetos compartilhados.
Nós o usamos para hackear certos aplicativos, substituindo funções existentes usando objetos compartilhados preparados.
fonte