Nur dir etwas Kontext zu geben, ist hier, was ich versuche zu erreichen: Ich in einer gemeinsamen Objektdatei ein const char * bin Einbettung, um in dem eine Version Zeichenfolge haben .so-Datei selbst. Ich mache die Datenanalyse und diese Zeichenfolge ermöglicht es mir, die Daten zu informieren, welche Version der Software, die es produziert. Das alles funktioniert gut.Offset in nm Symbolwert?
Das Problem, das ich habe, wenn ich versuche, direkt die Zeichenfolge aus der .so-Bibliothek zu lesen. Ich habe versucht,
nm libSMPselection.so | grep _version_info
zu verwenden und
000000000003d968 D __SMPselection_version_info
das ist alles in Ordnung zu bekommen und wie erwartet (die char * ist _SMPselection_version_info genannt). Allerdings hätte ich erwartet, jetzt in der Lage zu sein, die Datei zu öffnen, zu 0x3d968 zu suchen und meine Zeichenfolge zu lesen, aber alles, was ich bekomme, ist Müll.
Wenn ich die .so-Datei öffnen und einfach für den Inhalt der Zeichenfolge suchen (Ich weiß, wie es geht), kann ich es an der Adresse 0x2e0b4 finden. Bei dieser Adresse ist es da, null terminiert und wie erwartet. (Ich verwende diese Methode für jetzt.)
Ich bin kein Informatiker. Könnte jemand mir bitte erklären, warum der durch nm gezeigt Symbolwert nicht korrekt ist, oder anders, was ist der Symbolwert, wenn es nicht die Adresse des Symbols ist?
(Übrigens ich auf einem Mac arbeite mit OSX 10.7)
Dies ist eine großartige Idee. Ich versuche es gerade jetzt. Es gibt nur ein Problem: Die Bibliotheken, die ich teste, haben eine ziemlich lange Kette von Abhängigkeiten von anderen Bibliotheken. Wenn ich versuche, mit dlopen zu laden, bekomme ich Symbol-nicht-gefundene Fehler. Der Versions-String, an dem ich interessiert bin, hat natürlich keine Abhängigkeiten. Wie mache ich dl ignorieren Abhängigkeiten? – Simon
Ich habe überprüft. Das funktioniert großartig, wenn ich alle Abhängigkeiten geladen habe, was einer meiner beiden Anwendungsfälle ist. Danke für die Idee. – Simon