Frage

So wohl jeder weiß, dass Glibc /lib/libc.so.6 kann in der Schale wie eine normale ausführbare Datei ausgeführt werden, in welchen Fällen er druckt die Versionsinformationen und Ausfahrten. Dies wird über die Definition einen Eintrittspunkt in der .so getan. Für einige Fälle könnte es interessant sein, diese auch für andere Projekte zu verwenden. Leider ist der Low-Level-Einstiegspunkt Sie durch die ld -e Option können ein bisschen zu Low-Level: der dynamische Lader nicht verfügbar ist, so dass Sie keine richtigen Bibliotheksfunktionen aufrufen können. glibc aus diesem Grunde setzt die write () Systemaufruf über einen nackten Systemaufruf in diesem Einspeisepunkt.

Meine Frage ist nun, kann jeder denken Sie an eine schönen Art und Weise, wie man einen vollständigen dynamischen Linker aus diesem Eingangspunkt Bootstrap könnte, so dass man Funktionen aus anderen .so der zugreifen konnte?

War es hilfreich?

Lösung

Der Aufbau Ihrer gemeinsam genutzten Bibliothek mit -pie Option erscheint, um Ihnen alles, was Sie wollen:

/* pie.c */
#include <stdio.h>
int foo()
{
  printf("in %s %s:%d\n", __func__, __FILE__, __LINE__);
  return 42; 
}
int main() 
{ 
  printf("in %s %s:%d\n", __func__, __FILE__, __LINE__);
  return foo(); 
}


/* main.c */
#include <stdio.h>

extern int foo(void);
int main() 
{ 
  printf("in %s %s:%d\n", __func__, __FILE__, __LINE__);
  return foo(); 
}


$ gcc -fPIC -pie -o pie.so pie.c -Wl,-E
$ gcc main.c ./pie.so


$ ./pie.so
in main pie.c:9
in foo pie.c:4
$ ./a.out
in main main.c:6
in foo pie.c:4
$

P. S. glibc implementiert write(3) über Systemaufruf, weil es nirgendwo sonst muss nennen (es ist die niedrigsten Ebene bereits). Das hat nichts mit der Lage zu tun libc.so.6 auszuführen.

Andere Tipps

Ich nehme an, Sie Ihren ld -e Punkt zu einem Eintrittspunkt haben würde, die dann die dlopen() Familie von Funktionen, den Rest des Linkers zu finden und Bootstrap verwenden würde. Natürlich würden Sie, dass dlopen() sich entweder statisch gelinkt wurde dafür sorgen müssen, oder Sie vielleicht genug von Ihrem eigenen Linker Stummel implementieren müssen, um es zu bekommen (mit Systemaufruf Schnittstellen wie mmap() wie libc selbst tut.

Nichts davon klingt „nett“ zu mir. In der Tat nur den Gedanken an die glibc Quellen zu lesen (und die ld-linux Quellcode, als ein Beispiel) genug, um die Größe der Aufgabe klingt ziemlich ergraut mir zu beurteilen. Es könnte auch ein Portabilität Alptraum. Es kann große Unterschiede werden zwischen dem, wie Linux implementiert ld-linux und wie die Verknüpfungen fertig sind unter Opensolaris, FreeBSD, und so weiter. (Ich weiß nicht).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top