I -Wl, -wrap = sendto -Wl, -wrap zu verwenden, ich versuche, sendto in meinem letzten g ++ Link-Befehl, meine App verbindet den Standard sendto zu ersetzen Funktion mit meiner eigenen.Weder ld Wrap noch LD_PRELOAD Arbeitssystemaufruf abfangen
Ich kompiliere den folgenden Quellcode mit gcc -c -o wrap.o wrap.c und die wrap.o in den letzten g ++ Befehl, der die App verbindet (der Rest der App ist C++ daher die Verwendung von g ++)
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
ssize_t __real_sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
ssize_t __wrap_sendto
(
int sockfd,
const void *buf,
size_t len,
int flags,
const struct sockaddr *dest_addr,
socklen_t addrlen
)
{
printf("my wrap sendto ...\n");
return __real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
}
wenn ich sendto in meinem eigenen Quellcode verwenden, wird die Hülle in der Tat verwendet ok, aber alle 3rd-Party-Objekten gemeinsam i gegen in meinem letzten g ++ gelinkt, dass die Verwendung Befehl immer noch meine verwenden SENDTO das System sendto dh nicht Verpackung. Wie kann ich meinen sendto-Wrapper überall verwenden?
Ich habe auch einen LD_PRELOAD Ansatz mit einem sendto und dlsym (RTLD_NEXT) innerhalb versucht, aber das hat auch nicht funktioniert.
Wie kann ich herausfinden, warum die 3rd-Party-Bibliothek weiterhin die libc sendto direkt verwendet?
Wenn ich LDD verwenden, um alle gemeinsamen Objektabhängigkeiten meiner kompilierten App zu finden, und dann objdump -T auf jedem von ihnen grepping für sendto, bekomme ich UND (undefiniert) für alle gemeinsam genutzten Objekte von Drittanbietern. Die gemeinsam genutzten Objekte, die es definieren jedoch ist:
/lib64/libpthread.so.0
000000000000ed80 w DF .text 0000000000000064 GLIBC_2.2.5 sendto
/lib64/libc.so.6
00000000000e98d0 w DF .text 0000000000000064 GLIBC_2.2.5 sendto
ich sehe in glibc sendto.c auf git folgendes:
weak_alias (__libc_sendto, sendto)
weak_alias (__libc_sendto, __sendto)
kann dies eine Hilfe sein, eine Lösung in zu bekommen?
Symbolnamen nicht verändert (kompiliert als c mit gcc und extern "C" mit g ++ kein Unterschied). Versuchte Ihren Vorschlag ohne LD_PRELOAD, aber immer noch keinen Unterschied, ich sehe 'mein Wrap sendto' nur, wenn von meinem eigenen Code, nicht verbunden 3rd Party .so. Ich bin mir sicher, dass sie sendto anrufen, wie ich es von einer strace-Ausgabe sehen kann. Sie liefern definitiv keinen eigenen sendto, wie ich mit objdump -T und allen Shows UND bestätigt habe. – Waslap