Expanding on meine frühere Anmerkung, da dies nicht in diese mickrige Box passt (und das ist nur als eine Idee oder Diskussion, fühlen Sie sich nicht verpflichtet, Kopfgeld zu akzeptieren oder zu belohnen), vielleicht ist der einfachste und sauberste Weg, dies zu tun, zu addieren a Post-Build-Schritt zum Entfernen der PT_INTERP
Header aus der resultierenden Binärdatei?
Noch einfacher als das manuelle Bearbeiten der Header und möglicherweise alles verschieben muss nur PT_INTERP
durch PT_NULL
ersetzen. Ich weiß nicht, ob Sie einen Weg finden können, die Datei einfach über existierende Werkzeuge zu patchen (eine Art skriptfähiger Hexadezimalwert zum Suchen und Ersetzen) oder ob Sie dafür ein kleines Programm schreiben müssen. Ich weiß, dass libbfd (die GNU Binary File Descriptor-Bibliothek) in letzterem Fall dein Freund sein könnte, da es das ganze Geschäft viel einfacher macht.
Ich denke, ich verstehe einfach nicht, warum es wichtig ist, dies über eine ld
Option durchgeführt zu haben. Wenn verfügbar, kann ich sehen, warum es vorzuziehen wäre; aber da einige (zugegebenermaßen leichte) Googles darauf hindeuten, dass es kein solches Feature gibt, ist es vielleicht weniger mühsam, es separat und nach der Tat zu tun. (Vielleicht die Fahne ld
Zugabe ist einfacher als Skripts für den Ersatz von PT_INTERP
mit PT_NULL
, aber überzeugend die Devs es stromaufwärts zu ziehen ist eine andere Sache.)
Anscheinend (und bitte korrigieren Sie mich, wenn dies etwas, das Sie habe schon gesehen) Sie können das Verhalten von ld
in Bezug auf einen der ELF-Header in Ihrem Linker-Skript with the PHDRS
command überschreiben und :none
verwenden, um anzugeben, dass ein bestimmter Header-Typ in keinem Segment enthalten sein sollte. Ich bin nicht sicher, der Syntax, aber ich vermute, es wie folgt aussehen würde:
PHDRS
{
headers PT_PHDR PHDRS ;
interp PT_INTERP ;
text PT_LOAD FILEHDR PHDRS ;
data PT_LOAD ;
dynamic PT_DYNAMIC ;
}
SECTIONS
{
. = SIZEOF_HEADERS;
.interp : { } :none
...
}
Vom ld docs Sie die Linker-Skript mit --library-path
außer Kraft setzen kann:
--library-path=searchdir
hinzufügen Weg searchdir zu der Liste der Pfade, die nach Archivbibliotheken und ld Kontrollskripts suchen werden. Sie können diese Option beliebig oft unter verwenden. Die Verzeichnisse werden in der Reihenfolge gesucht, in der sie in der Befehlszeile angegeben sind. Verzeichnisse, die in der Befehlszeile angegeben sind, werden vor den Standardverzeichnissen gesucht. Alle Optionen -L gelten für alle -l Optionen, unabhängig von der Reihenfolge, in der die Optionen angezeigt werden.Der Standardsatz der durchsuchten Pfade (ohne mit `-L 'angegeben zu werden) hängt davon ab, welcher Emulationsmodus ld verwendet, und in einigen Fällen auch von der Konfiguration. Siehe Abschnitt Umgebung Variablen. Die Pfade können auch in einem Link-Skript mit dem Befehl SEARCH_DIR angegeben werden. Auf diese Weise angegebene Verzeichnisse werden unter dem Punkt gesucht, in dem das Linker-Skript in der Befehlszeile angezeigt wird. Auch
, von the section on Implicit Linker Scripts:
Wenn Sie eine Linker Eingabedatei angeben, die der Linker nicht als Objekt-Datei oder einer Archivdatei erkennen kann, wird es versuchen, die Datei als einer lesen Linker-Skript. Wenn die Datei nicht als Linker-Skript analysiert werden kann, meldet der Linker einen Fehler.
Welche implizieren Werte in benutzerdefinierter Linker-Skripte, im Gegensatz zu implizit definierten Linker-Skripte scheinen würde, wird ersetzen Werte in den Standard-Skripten.
lassen Sie mich sehen, ob ich diese gerade haben. Sie geben Ihren eigenen Einstiegspunkt an, der wiederum einen benutzerdefinierten Umzug durchführt, und möchten nicht, dass der Kernel im Standardinterpreter geladen wird? Was ist, wenn Sie mit Bibliotheken verlinken, die einen Initialisierungslauf über .init benötigen? Meiner Erfahrung nach, wenn Sie etwas mit Ihren ausführbaren Dateien machen wollen, aber es gibt keine Möglichkeit, es mit einer Permutation von LDFLAGS zu erzeugen, dann ist es keine gute Idee. –
Wenn ich versuche, dies in das Build-System einer Anwendung zu integrieren, würde ich Ihnen 100% zustimmen. Für eine Anwendung, die mit Linker-Optionen wie diesem täuscht, handelt es sich um einen schrecklichen Hack, der sowieso nicht funktioniert, da alle '.a'-Bibliotheken als PIC erstellt werden müssen. Woran ich gerade arbeite, ist eine neue Toolchain-Option, die für den Einsatz in sicherheitsgerichteten Distributionen gedacht ist, bei denen der dynamische Linker für setuid-Binärdateien ausgeführt wird, ist ein inakzeptables Risiko. Es ist viel einfacher zu implementieren, wenn keine Änderungen auf der Ebene "ld" erforderlich sind, sondern nur auf der Ebene gcc specfile und 'crt'. –
sieht es so aus, als müsstest du einen Patch für ld schreiben und dann mit ihnen darüber streiten, warum sie auf den trunk angewendet werden soll. das hört sich auch nach sehr interessanter Arbeit an. –