
Ubuntu日本語フォーラム

ログインしていません。
Ubuntu 14.04.5 LTS環境です
認証処理の実装を試みているのですが
以下のライブラリ提供関数存在しないエラーがリンク時に発生しています。
test.cpp:81: undefined reference to `pam_start(char const*, char const*, pam_conv const*, pam_handle**)'
test.cpp:95: undefined reference to `pam_acct_mgmt(pam_handle*, int)'
test.cpp:111: undefined reference to `pam_end(pam_handle*, int)'
collect2: error: ld returned 1 exit status
libpamライブラリがないことが原因と考え
以下のパッケージをインストールして再度、試してみましたが
問題は是正されませんでした。
apt install libpam-dev
apt install libpam-modules
apt install libpam0g-dev
この問題を解決するために
必要なパッケージもしくは必要な設定をご存知であれば
お手数ですがご教示をお願いいたします。
オフライン
どのように コンパイル、リンクを行っていますか?
リンクオプション -lpam は指定されていますか?
オフライン
ellipticさん
コメントありがとうございます
ビルドについてはcmakeを用いて実施しています。
-lpamについては
CMakeLists.txtで以下のように指定しています。
target_link_libraries(${PROJECT_NAME} -lpam)
以上です、よろしくお願いいたします。
オフライン
いつもお世話になります、追加で情報を記述いたします。
以下の記述を
target_link_libraries(${PROJECT_NAME} -lpam)
フルパスに書き換えて確認してみましたが
target_link_libraries(${PROJECT_NAME} "/usr/lib/x86_64-linux-gnu/libpam.so")
以下のようなエラーが発生します
/usr/lib/x86_64-linux-gnu/libpam.so:file not recognized: File format not recognized
他にも以下のフルパスで確認してみましたが同様でした
/lib/Linux-PAM-1.5.2/libpam/.libs/libpam.so
/usr/local/pam/1_5_2/lib/libpam.so
なにか問題として考えられることはありますでしょうか
オフライン
いつもお世話になります、追加の情報です
CMakeLists.txtに以下の記述で環境変数を出力すると
find_package(libpam)
include_directories(${PAM_INCLUDE_PATH})
message("PAM_INCLUDE_PATH:${PAM_INCLUDE_PATH}")
message("PAM_LIBRARY:${PAM_LIBRARY}")
message("LIBPAM_INCLUDE_PATH:${LIBPAM_INCLUDE_PATH}")
以下のような出力になりました
PAM_INCLUDE_PATH:PAM_INCLUDE_PATH-NOTFOUND
PAM_LIBRARY:PAM_LIBRARY-NOTFOUND
LIBPAM_INCLUDE_PATH:
本件、情報があればお手数ですがご教示ください
オフライン
#1 ecoeco による投稿:
Ubuntu 14.04.5 LTS環境です
通常サポート終了した14.04を使うのはなにか必要があってのことですか?
また 14.04.6 LTSにしてないのはなぜですか?
#4 ecoeco による投稿:
以下の記述を
target_link_libraries(${PROJECT_NAME} -lpam)
フルパスに書き換えて確認してみましたが
target_link_libraries(${PROJECT_NAME} "/usr/lib/x86_64-linux-gnu/libpam.so")
以下のようなエラーが発生します
/usr/lib/x86_64-linux-gnu/libpam.so:file not recognized: File format not recognized
渡されたファイルを gccが ライブラリではなく コンパイル対象として受け取り、
「C/C++ のソースファイルではない!」というときのメッセージらしいですね。
Ubuntu 22.04 LTS, CMake 3.22.1 では
-lpam
pam
libpam.so
/usr/lib/x86_64-linux-gnu/libpam.so
のどれでもエラーにならずに受け付けました。
#4 ecoeco による投稿:
他にも以下のフルパスで確認してみましたが同様でした
/lib/Linux-PAM-1.5.2/libpam/.libs/libpam.so
/usr/local/pam/1_5_2/lib/libpam.so
自分でLinux-PAM-1.5.2をソースからビルドしてインストールしたのでしょうか?
Ubuntu 14.04 LTS は PAM 1.1.8 だと思いますがどちらを使用していますか?
Ubuntuのものより新しいバージョンをインストールしたなら、libpam0g-dev
パッケージは使わずに、新しい方のヘッダファイル、ライブラリに揃えるべきだと思います。
問題が起きるのは libpamライブラリのみなのでしょうか?
他の共有ライブラリのリンクは成功しますか?
CMakeを通さずに 直接 コマンドラインで コンパイル/リンクをしたら
どうなりますか?
↓はインターネットで見つけたパスワードを入力させるだけの小さなサンプルプログラムを
コンパイルしてみた例。
$ cat pam-sample.c
/* pam-sample.c from
* 4.1. Creating a PAM-Aware Application - Linux Security Cookbook [Book]
* https://www.oreilly.com/library/view/linux-security-cookbook/0596003919/ch04s01.html
* gcc pam-sample.c -lpam -lpam_misc -o pam-sample
*/
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <pwd.h>
#include <sys/types.h>
#include <stdio.h>
#define MY_CONFIG "su"
static struct pam_conv conv = { misc_conv, NULL };
int main( )
{
pam_handle_t *pamh;
int result;
struct passwd *pw;
if ((pw = getpwuid(getuid( ))) == NULL)
perror("getpwuid");
else if ((result = pam_start(MY_CONFIG, pw->pw_name, &conv, &pamh)) != PAM_SUCCESS)
fprintf(stderr, "start failed: %d\n", result);
else if ((result = pam_authenticate(pamh, 0)) != PAM_SUCCESS)
fprintf(stderr, "authenticate failed: %d\n", result);
else if ((result = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
fprintf(stderr, "acct_mgmt failed: %d\n", result);
else if ((result = pam_end(pamh, result)) != PAM_SUCCESS) {
fprintf(stderr, "end failed: %d\n", result);
return result;
} else {
/* Run_My_Big_Application( ) */ ; /* Run your application code */
printf("authentication - PASS.\n");
}
return 0;
}
$ gcc pam-sample.c -lpam -lpam_misc -o pam-sample
$ ls -l pam-sample*
-rwxr-xr-x 1 user user 17176 8月 27 12:52 pam-sample
-rw-r--r-- 1 user user 1231 8月 27 12:50 pam-sample.c
$ ./pam-sample
Password: # 正しいパスワード
authentication - PASS.
$ ./pam-sample
Password: # 間違えると PAM_AUTH_ERR
authenticate failed: 7
$オフライン