お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2022-08-24 11:43:08

ecoeco
新しいメンバ
登録日: 2022-08-24

libpamライブラリのリンクについて

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

この問題を解決するために
必要なパッケージもしくは必要な設定をご存知であれば
お手数ですがご教示をお願いいたします。

オフライン

 

#2 2022-08-24 21:45:29

elliptic
メンバ
登録日: 2020-03-05

Re: libpamライブラリのリンクについて

どのように コンパイル、リンクを行っていますか?
リンクオプション -lpam は指定されていますか?

オフライン

 

#3 2022-08-24 22:39:19

ecoeco
新しいメンバ
登録日: 2022-08-24

Re: libpamライブラリのリンクについて

ellipticさん

コメントありがとうございます

ビルドについてはcmakeを用いて実施しています。

-lpamについては
CMakeLists.txtで以下のように指定しています。

target_link_libraries(${PROJECT_NAME} -lpam)

以上です、よろしくお願いいたします。

オフライン

 

#4 2022-08-25 11:48:05

ecoeco
新しいメンバ
登録日: 2022-08-24

Re: libpamライブラリのリンクについて

いつもお世話になります、追加で情報を記述いたします。
以下の記述を

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

なにか問題として考えられることはありますでしょうか

オフライン

 

#5 2022-08-25 21:30:24

ecoeco
新しいメンバ
登録日: 2022-08-24

Re: libpamライブラリのリンクについて

いつもお世話になります、追加の情報です

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:

本件、情報があればお手数ですがご教示ください

オフライン

 

#6 2022-08-29 03:17:48

elliptic
メンバ
登録日: 2020-03-05

Re: libpamライブラリのリンクについて

#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
$

オフライン

 

Board footer

Powered by FluxBB