Pergunta

me deparei com uma referência a ele recentemente sobre proggit e (a partir de agora) não é explicado.

Eu suspeito este poderia ser ela, mas eu não sei ao certo.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top