Qual é o truque LD_PRELOAD?
-
06-07-2019 - |
Solução
Se você definir LD_PRELOAD
para o caminho de um objeto compartilhado, esse arquivo será carregado antes qualquer outra biblioteca (incluindo o tempo de execução C, libc.so
). Então, para executar ls
com a sua implementação especial malloc()
, faça o seguinte:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
Outras dicas
Você pode substituir símbolos nas bibliotecas de ações criando uma biblioteca com os mesmos símbolos e especificando a biblioteca em LD_PRELOAD
.
Algumas pessoas usá-lo para especificar bibliotecas em locais fora do padrão, mas LD_LIBRARY_PATH
é melhor para o efeito.
Com LD_PRELOAD
você pode dar bibliotecas precedência.
Por exemplo, você pode escrever uma biblioteca que implementar malloc
e free
. E, carregando-os com LD_PRELOAD
seu malloc
e free
será executada em vez dos padrões.
Como muitas pessoas mencionados, usando LD_PRELOAD
a biblioteca de pré-carga. BTW, você pode Verificar se a configuração está disponível por ordem ldd
.
Exemplo:. Suponha que você precisa para 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)
Assim, definir o seu ambiente de pré-carga:
export LD_PRELOAD=/home/patric/libselinux.so.1
Verifique sua biblioteca novamente:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
listas LD_PRELOAD
bibliotecas compartilhadas com funções que substituem o conjunto padrão, assim como /etc/ld.so.preload
faz. Estes são implementados pelo /lib/ld-linux.so
loader. Se você quiser substituir apenas algumas funções selecionadas, você pode fazer isso criando um arquivo de objeto de substituição e ajustar LD_PRELOAD
; as funções neste arquivo objeto irá substituir apenas aquelas funções deixando os outros como eles eram.
Para obter mais informações sobre a visita bibliotecas compartilhadas http://tldp.org/HOWTO/Program-Library-HOWTO/ shared-libraries.html
é fácil mylib.so
exportação para env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
Para desativar:
$ export LD_PRELOAD=
Aqui está um post de blog detalhadas sobre o pré-carregamento:
https://blog.cryptomilk.org/2014/07 / 21 / o que-é-o pré-carregamento /
Usando o caminho LD_PRELOAD
, você pode forçar o carregamento de aplicativos para carregar objetos compartilhados fornecidos, sobre o padrão fornecido.
Os desenvolvedores usa isso para depurar as suas aplicações, fornecendo versões diferentes dos objetos compartilhados.
Nós usamos isso para cortar certas aplicações, substituindo funções existentes utilizando objetos compartilhados preparados.
quando LD_PRELOAD é utilizado esse arquivo será carregado antes de qualquer outra
$export LD_PRELOAD=/path/lib
lib de ser pré carregado, mesmo isso pode ser usado em programas demasiado