2016-06-11 2 views
1

Недавно влюбился в js-ctypes (очень удобно для написания небольших приложений, которым нужен доступ к некоторым базовым функциям ОС), я пытаюсь использовать их для небольшого прототип менеджера регистрации, где я бы хотел открыть PAM.Неопределенный символ при попытке вызвать pam_start из js-ctypes

Для этого я слежу за учебником по менеджеру дисплея GNU/Linux, компилируя файл pam.c, найденный в его репозитории Github ^1, и вызывая login(const char *username, const char *password, pid_t *child_pid) из моего кода javascript.

Я использовал следующие команды для компиляции библиотеки:

  • GCC -fPIC -c pam.c
  • GCC -shared -o pam.so pam.o

Код JavaScript код вызова выглядит следующим образом (пользователь и два PW Textboxes определены в XUL):

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); 
} 

К сожалению, когда Runni нг приложения и вызов этой функции, приложение завершает работу со следующим сообщением об ошибке

symbol lookup error: /login-manager/chrome/content/lib/pam.so: undefined symbol: pam_start

pam_start определяются вне сферы действия pam.c/pam.h, снабженного учебником. Это определение можно найти внутри /usr/lib/security/pam_appl.h. Как я могу облегчить этот факт и создать общий объект, который позволит мне правильно назвать функции login() и logout(), предоставленные как часть исходного учебника ^2?

+0

Упс я не видел эту тему в течение месяца, извините, что, пожалуйста. Неопределенный символ означает, что он не может найти его как «extern C». Значит, ты на правильном пути, сможешь ли это исправить? Вы видели это руководство здесь: https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Using_js-ctypes/ctypes.open – Noitidart

+0

, вы можете найти этот подмодуль полезным в своих аддонах, он имеет ctyped много вещей для всех платформ - https://github.com/Noitidart/ostypes – Noitidart

+1

Привет @Noitidart. Я исправил это через несколько дней после того, как я впервые задал вопрос. Просто забыл ответить сам. Оказалось, что мне нужно было явно ссылаться на libpam во время процесса сборки. Спасибо, что дали нам ostypes, кстати. Мне очень нравится использовать его. – user237251

ответ

2

Исправлено около месяца назад. Оказалось, что это проблема связи. Вот как правильно скомпилировать его в libpam.

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

 Смежные вопросы

  • Нет связанных вопросов^_^