Nachdem ich mich vor kurzem in js-ctypes verliebt habe (wirklich praktisch zum Schreiben kleiner Anwendungen, die Zugriff auf einige zugrunde liegende Betriebssystemfunktionen benötigen), versuche ich, sie für ein kleines zu verwenden Login-Manager-Prototyp, wo ich PAM entlarven möchte.Undefiniertes Symbol beim Aufruf von pam_start von js-ctypes
Dafür habe ich ein GNU/Linux-Manager-Tutorial gelernt, kompiliert die PAM.c-Datei in seinem Github ^1 Repository und ruft login(const char *username, const char *password, pid_t *child_pid)
von meinem Javascript-Code.
benutzte ich die folgenden Befehle, um die Bibliothek zu kompilieren:
- gcc -fPIC -c pam.c
- gcc -shared -o pam.so pam.o
Die Javascript Telefonvorwahl ist wie folgt (user und pw sind zwei in XUL definiert Textfelder):
function login(user, pw) {
var {ctypes} = Components.utils.import("resource://gre/modules/ctypes.jsm", null);
Components.utils.import("resource://gre/modules/Services.jsm");
var cr = Components.classes['@mozilla.org/chrome/chrome-registry;1'].getService(Components.interfaces.nsIChromeRegistry);
var chromeURI_myLib = Services.io.newURI('chrome://app/content/lib/pam.so', 'UTF-8', null);
var localFile_myLib = cr.convertChromeURL(chromeURI_myLib);
var jarPath_myLib = localFile_myLib.spec;
var filePath_myLib = localFile_myLib.path;
var libc = ctypes.open(filePath_myLib);
/* Import a function */
var loginFunc = libc.declare("login", /* function name */
ctypes.default_abi, /* call ABI */
ctypes.int,
ctypes.char.ptr,
ctypes.char.ptr);
loginFunc(user, pw);
}
Leider, wenn Runnin die Anwendung g und Aufruf dieser Funktion wird die Anwendung beendet mit der folgenden Fehlermeldung
symbol lookup error: /login-manager/chrome/content/lib/pam.so: undefined symbol: pam_start
pam_start außerhalb des Schutzbereichs der pam.c/pam.h mit dem Tutorial vorgesehen definiert ist. Es ist Definition kann innerhalb /usr/lib/security/pam_appl.h
gefunden werden. Wie kann ich diese Tatsache lindern und ein gemeinsames Objekt erstellen, mit dem ich die Funktionen login()
und , die im ursprünglichen Lernprogramm ^2 enthalten sind, ordnungsgemäß aufrufen kann?
Whoops Ich habe dieses Thema seit einem Monat nicht mehr gesehen, bitte entschuldigen. Ein nicht definiertes Symbol bedeutet, dass es nicht als "externes C" gefunden werden kann. Sie sind also auf dem richtigen Weg, konnten Sie es beheben? Haben Sie dieses Handbuch hier gesehen - https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Using_js-ctypes/ctypes.open – Noitidart
Sie könnten dieses Submodul in Ihren Addons nützlich finden, es hat ctyped eine Menge Zeug für alle Plattformen - https://github.com/Noitidart/ostypes – Noitidart
Hallo @Noitidart. Das habe ich ein paar Tage nach der ersten Frage behoben. Einfach vergessen, es selbst zu beantworten. Es stellte sich heraus, dass ich während des Build-Prozesses explizit auf libpam verweisen musste. Danke, dass Sie uns OSTYPES geben, BTW. Ich genieße es wirklich, es zu benutzen. – user237251