运行在64位系统上使用32位标志编译的shard对象时出错:PAM无法dlopen my_pam.so错误的ELF类:ELFCLASS32

时间:2018-04-09 06:51:31

标签: ubuntu dll linker pam

我在这个编译标志的接口中编译pam hook:

gcc -O0 -g -m32  -I/ext -I/inc -MD -MP -c -DARCH=x86 -o my_pam.o my_pam.c
 cat /etc/pam.d/sshd
account     optional      /root/my_pam.so
session     optional      /root/my_pam.so
auth        optional      /root/my_pam.so
password    optional      /root/my_pam.so

代码my_pam.c:

#define _GNU_SOURCE
#define PAM_OK 0
#define PAM_ERROR -1    
/*PAM defintion */
#define PAM_SM_AUTH
#define PAM_SM_ACCOUNT
#define PAM_SM_SESSION
#define PAM_SM_PASSWORD 
/*PAM includes */
#include <security/pam_modules.h>
#include <security/pam_modutil.h>
#include <security/pam_ext.h>


/* The actual pam functions are merely wrappers around succeed_if */
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {

        return (PAM_SUCCESS);
}

PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    return PAM_SUCCESS;

}

PAM_EXTERN int pam_sm_chauthtok(pam_handle_t    *pamh,const int flags,int argc,const char **argv)
{
    return PAM_SUCCESS;
}


PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    return PAM_SUCCESS;

}

PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
    return PAM_SUCCESS;
}

    PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
        return PAM_SUCCESS;
    }

当我尝试通过ssh登录时,我无法登录和日志文件/var/log/auth.log 电话给我的那个错误:  PAM无法dlopen /root/my_pam.so错误的ELF类:ELFCLASS32 我想这是因为我在64位ubuntu并使用32位标志编译(这是我想要的),我确实安装了sudo apt-get install libpam0g-dev:i386 为了拥有32位的pam库,但似乎pam仍在寻找它的64位版本。我如何解决这个问题并让ubuntu使用我的32位pam?

1 个答案:

答案 0 :(得分:0)

你不能,我在这里找到了这个答案Use 32bit shared library from 64bit application? 经过几次尝试并经历了其他几个问题之后,你就无法编译它并将64位代码与32位一起使用。