尝试从js-ctypes调用pam_start时未定义的符号

时间:2016-06-11 17:06:59

标签: c xulrunner jsctypes

最近爱上了js-ctypes(对于编写需要访问某些底层操作系统功能的小应用程序非常方便),我试图将它们用于一个小型登录管理器原型,我想在那里暴露PAM

为此,我一直在关注GNU / Linux显示管理器教程,编译在其Github ^1存储库中找到的pam.c文件,并从我的javascript代码中调用login(const char *username, const char *password, pid_t *child_pid)

我使用以下命令编译库:

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

javascript调用代码如下(用户和pw是在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);
}

不幸的是,在运行应用程序并调用此函数时,应用程序退出并显示以下错误消息

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中找到。如何减轻这一事实并创建一个共享对象,让我可以正确调用作为原始教程^2的一部分提供的login()logout()函数?

1 个答案:

答案 0 :(得分:3)

大约一个月前修好了它。原来是一个链接问题。以下是如何针对libpam正确编译它。

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