
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 $
オフライン