Aufgrund einiger Einschränkungen bin ich gezwungen, zur Laufzeit eine in C geschriebene Bibliothek zu laden. Eine dritte Partei stellt mir zwei Bibliotheken als statische Archive zur Verfügung, die wir zu gemeinsamen Objekten machen. Die Anwendung, mit der ich arbeite, lädt eine der Bibliotheken zur Laufzeit basierend auf einigen Hardware-Parametern. Leider ist eine der Bibliotheken weitgehend mit globalen Variablen konfiguriert.
Ich verwende bereits dlsym, um Funktionsreferenzen zu laden, aber kann ich auch dlsym verwenden, um Verweise auf diese globalen Variablen zu laden?
Ja, Sie können dlsym verwenden, um auf globale Variablen zuzugreifen (solange diese exportiert und nicht statisch sind). Das folgende Beispiel ist in C ++ und Mac, aber offensichtlich funktioniert C gut.
lib.cpp:
%Vor%uselib.cpp
%Vor%Ausgabe:
%Vor%Ja, das kann und möchte ich lieber tun, als Funktionen zu laden. Mein Standard-IOC-Modell macht es so.
Ich bevorzuge es, weil:
Die Umwandlung von einem void * in einen Zeiger auf ein Objekt ist technisch sicherer als die eines Funktionszeigers, obwohl das System, das void * mit dlsym verwendet, offensichtlich den Zeiger konvertieren muss. (GetProcAddress von Microsoft gibt ihren eigenen Zeigertyp zurück, was in diesem Fall meiner Meinung nach eine bessere Wahl ist, da sie die tatsächliche Bedeutung später ändern können, falls sie dies müssen).
Weil ich es in C ++ mache, kann ich erzwingen, dass jedes exportierte Objekt von einer gemeinsamen Basisklasse abgeleitet wird, und dann kann ich dynamic_cast von dieser Klasse zu der tatsächlichen verwenden, die ich erwarte. Dies bedeutet, dass ich einen Fehler abfangen kann, wenn er nicht von der späteren Klasse abgeleitet wird, wodurch später Laufzeitfehler gespeichert werden.