2016-06-11 25 views
1

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?

+0

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

+0

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

+1

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

Antwort

2

Behoben vor etwa einem Monat. Es stellte sich heraus, dass es ein Verknüpfungsproblem war. Hier ist, wie man es richtig gegen libpam kompiliert.

gcc -fPIC -c DM.c 
gcc -shared -o DM.so DM.o -lpam