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.
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.
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 C libc.so
). Portanto, para executar ls
com sua malloc()
implementação especial , faça o seguinte:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
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.
Com LD_PRELOAD
você pode dar precedência às bibliotecas.
Por exemplo, você pode escrever uma biblioteca que implemente malloc
e free
. E carregando-os com o LD_PRELOAD
seu malloc
e free
será executado em vez dos padrões.
calloc
? isso não estragaria tudo?
malloc
e grátis são projetados especificamente na glibc para permitir que isso e o estoque calloc
consigam ligar para o importado malloc
. 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 por ldd
comando.
Exemplo: suponha que você precise pré-carregar o seu próprio libselinux.so.1
.
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
Portanto, defina seu ambiente de pré-carregamento:
export LD_PRELOAD=/home/patric/libselinux.so.1
Verifique sua biblioteca novamente:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
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ção LD_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
Aqui está uma postagem detalhada do blog sobre pré-carregamento:
é fácil exportar mylib.so
para env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
desabilitar :
$ export LD_PRELOAD=
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 programas
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.