Em suma, sua biblioteca carregada por LD_PRELOAD
substitui o syslog (3) em vez de se conectar (3 ).
O soquete /dev/log
Unix é usado pela função glibc syslog (3), que se conecta a ele e grava nele. Ignorar connect (3) provavelmente não funciona porque a implementação do syslog (3) dentro da glibc executará a chamada de sistema connect (2) em vez da função de biblioteca, portanto, um gancho LD_PRELOAD
não interceptará a chamada de dentro do syslog (3).
Há uma desconexão entre strace
, que mostra o syscalls, e LD_PRELOAD
, que pode substituir as funções da biblioteca (nesse caso, funções da glibc.) O fato de que há um connect(3) função glibc e também um connect (2) também ajuda nessa confusão. (É possível que usar ltrace
teria ajudado aqui, mostrando chamadas para o syslog (3).)
Provavelmente você pode confirmar que a substituição da conexão (3) em LD_PRELOAD
como você está fazendo não funcionará com o syslog (3) fazendo com que seu programa de teste chame syslog (3) diretamente, em vez de se conectar explicitamente a /dev/log
, que eu suspeito é como o aplicativo .NET Core está se comportando.
Conectar-se ao syslog (3) também é potencialmente mais útil, porque estando em um nível mais alto na pilha, você pode usar esse gancho para tomar decisões como encaminhar seletivamente algumas das mensagens para o syslog . (Você pode carregar a função syslog da glibc com dlsym(RTLD_NEXT, "syslog")
e, em seguida, você pode usar esse ponteiro de função para chamar syslog (3) para as mensagens que você deseja encaminhar do gancho.)
A abordagem de substituir /dev/log
por um link simbólico para /dev/null
está com defeito em que /dev/null
não aceitará uma operação connect (2) (somente operações de arquivo como open (2)), portanto syslog (3) vai tentar se conectar e obter um erro e de alguma forma tentar manipulá-lo (ou talvez devolvê-lo ao chamador), em qualquer caso, isso pode ter efeitos colaterais.
Espero que o uso de uma substituição LD_PRELOAD
do syslog (3) seja tudo o que você precisa aqui.