Ich habe eine Elf-Binärdatei, die statisch mit libc verknüpft ist. Ich habe keinen Zugriff auf seinen C-Code. Ich würde gerne OpenOnload-Bibliothek verwenden, die eine Implementierung von Sockets im User-Space hat und daher geringere Latenz im Vergleich zu Standard-libc-Versionen bietet. OpenOnload implementiert die Standard-Socket-API und überschreibt die libc-Version mit LD_PRELOAD. Da diese Elf-Binärdatei jedoch statisch verknüpft ist, kann sie nicht die OpenOnload-Version der Socket-API verwenden.
Ich glaube, dass das Konvertieren dieser Binärdatei zu einer dynamischen Verknüpfung mit OpenOnload mit den folgenden Schritten möglich ist:
Als ersten Schnitt habe ich versucht, nur drei PT_LOAD-Segmente hinzuzufügen. Neue Segmentkopfzeilen wurden nach vorhandenen PT_LOAD-Segmentkopfzeilen hinzugefügt. Außerdem wurde vm_addr von vorhandenen Segmenten nicht geändert. Dateioffsets existierender Segmente wurden basierend auf p_align nach unten zur nächsten ausgerichteten Adresse verschoben. Neue PT_LOAD-Segmente wurden in der Datei am Ende der Datei hinzugefügt.
Nachdem ich die Datei neu geschrieben habe, wurde sie vom Kernel richtig geladen, aber dann sofort seg-fault.
Meine Fragen sind:
Was Sie versuchen, ist auf keine automatisierte Weise möglich. Zum Zeitpunkt der statischen Verknüpfung wurden alle Umzugsinformationen, die Aufrufe von libc als Aufrufe von libc identifizieren, aufgelöst und entfernt. Wenn Debugging-Symbole in der Binärdatei vorhanden sind, ist es möglich, zu identifizieren "dieser Bereich von Bytes in dem Textsegment entspricht der-und-so-libc-Funktion", aber es gibt keine Möglichkeit, Referenzen zu der Funktion zu identifizieren , die in den Anweisungsbytestrom ohne Markup eingebettet werden, um sie zu identifizieren. Sie könnten Heuristiken verwenden, die auf Disassemblierung basieren, aber sie wären unvollständig und unzuverlässig (Möglichkeit von sowohl falschen als auch falsch positiven Ergebnissen).
Was Offsetverschiebungen betrifft, können Sie absolut nichts an den Ladeadressen für eine statische verknüpfte Binärdatei ändern. Wenn Sie Header vor den Ladesegmenten einfügen müssen, müssen Sie eine ganze Seite einfügen und die Dateioffsets in der Programmheadetabelle aktualisieren (indem Sie ihnen eine Seite hinzufügen), während das Laden der virtuellen Adresse gleich bleibt. Da das, was Sie versuchen zu tun, insgesamt jedoch nicht möglich ist, ist das Offset-Verschiebungsproblem die geringste Ihrer Sorgen.
Wenn das Programm keine hohe Leistung erfordert, können Sie es möglicherweise unter qemu emulation auf App-Ebene ausführen, wobei qemu die Sockets emulation / wrapper durchläuft.
Tags und Links c linux elf openonload