Pam
無法載入我的 PAM 模組 - 如何診斷?
我編寫了一個
PAM
服務模組,並lightdm
通過編輯將其添加到/etc/pam.d/lightdm
.但
lightdm
抱怨(在/var/log/auth.log
Ubuntu 14.04 上):Sep 9 14:16:48 Ubuntu-build lightdm: PAM unable to dlopen(pam_my.so): /lib/security/pam_my.so: cannot open shared object file: No such file or directory
當我通過查看發生的事情時
strace()
,與日誌消息相反,它正在查找並打開我的PAM
模組並開始檢查它,但隨後它放棄並繼續在其他目錄中搜尋它,最終抱怨它找不到它。這是一些範例輸出:12230 open("/lib/x86_64-linux-gnu/security/pam_my.so", O_RDONLY|O_CLOEXEC) = 4 12230 read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\f\0\0\0\0\0\0"..., 832) = 832 12230 fstat(4, {st_mode=S_IFREG|0644, st_size=17728, ...}) = 0 12230 mmap(NULL, 2105544, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7fe087ebe000 12230 mprotect(0x7fe087ec0000, 2093056, PROT_NONE) = 0 12230 mmap(0x7fe0880bf000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x1000) = 0x7fe0880bf000 12230 close(4) = 0
在一個工作案例(例如
pam_unix.so
)中,而不是close()
它繼續另一個mmap()
然後繼續。我查看了所有登錄日誌,/var/log/*
找不到更多資訊來告訴我有什麼PAM
不滿意的地方。我什至不知道我可以查看什麼來源來診斷出了什麼問題。該模組似乎已正確建構。我已經閱讀Module Writers Guide
並認為我遵循了所有正確的規則。關於如何進行診斷的任何線索?我也嘗試過觸摸
/etc/pam_debug
,但沒有提供任何有用的日誌消息。
問題解決了。作為記錄,這是我的診斷方法:
- 從https://git.fedorahosted.org/cgit/linux-pam.git下載 Linux-PAM 源
- 用 pam_permit.c 的內容替換了我的原始碼(一個非常簡單的模組,無需使用者互動就可以成功)
- 檢查參考源的建構以確定任何差異。
當我添加連結器標誌
--no-undefined
並在pam
和dl
庫中顯式連結時,我發現我有一個未定義的符號(strlcpy
,它僅存在於BSD Unix
),這阻止了庫的載入。