Frage Dynamische Symbolauflösung der ausführbaren Datei mit LLVM


Ich benutze derzeit LLVM's  ObjectFile (dokumentiert Hier) um eine ausführbare Datei darzustellen. Ich habe erfolgreich eine ausführbare Datei in die ObjectFile und möchte bestimmen, welche Rufzieladressen in meiner ausführbaren Datei den Symbolnamen entsprechen, die in der symbol_iterator erhalten durch einen Anruf an die begin_dynamic_symbols() Funktion. Iterieren über jedes der Symbole in der symbol_iterator gibt mir den Namen jedes Symbols und seiner Adresse, aber da die Symbole dynamisch sind, ist die Adresse jedes Symbols -1; Dies deutet darauf hin, dass die ObjectFile verknüpft die Symbolnamen nicht direkt mit den entsprechenden Anrufzieladressen.

Gibt es eine Möglichkeit zu bestimmen, welche Anrufzieladressen zu welchen dynamischen Symbolen in einem Verzeichnis gehören? ObjectFile? Ich möchte lieber nicht alle Sprünge manuell durchrechnen PLT und GOT wenn ich es vermeiden kann.


12
2018-05-03 17:50


Ursprung


Antworten:


Die Adressen dynamischer Symbole werden nur berechnet, wenn die Objektdateien in den Speicher geladen und in die Symboltabelle des Programms eingebunden werden. Im Allgemeinen ist es unmöglich, ihre endgültige Adresse vor der Verknüpfung zu bestimmen.

Möglicherweise können Sie die gewünschten Daten mithilfe des Link-Time Optimization-Moduls von LLVM anstelle von ObjectFile abrufen, da dies beim Laden eines Moduls eine Adressverknüpfung durchführt, wenn ich mich richtig erinnere.

Viel Glück!


1
2018-05-27 10:55