database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 10483 게시물 읽기
No. 10483
동적라이브러리 만들기 관련해서 문의드립니다.
작성자
박준영
작성일
2024-07-16 05:45ⓒ
2024-07-16 09:04ⓜ
조회수
163

툴 : visual studio 2022

서버 : CentOS7.5, Postgresql-11


1. 툴 include 및 lib 설정


속성

[VC++ 디렉토리]


포함 디렉토리 : /usr/pgsql-11/include


라이브러리 디렉토리 :/usr/pgsql-11/lib


[C/C++]

일반 > 추가 포함 디렉토리 : /usr/pgsql-11/include

모든 옵션 > 추가 포함 디렉토리 : /usr/pgsql-11/include


[링커]

일반 > 추가 라이브러리 디렉토리 : /usr/pgsql-11/lib

입력 > 라이브러리 종속성 : pgsql

      추가 종속성 : -L/usr/pgsql-11/lib -lpq



2. C 언어 


#include

#include

#include


int main() {

    const char* conninfo;

    PGconn* conn;

    PGresult* res;

    int         nFields;

    int         i, j;


    // 연결 정보 설정 (예시)

    conninfo = "dbname=test user=postgres password=test1";


    // PostgreSQL 데이터베이스 연결 시도

    conn = PQconnectdb(conninfo);


    // 연결 상태 확인

    if (PQstatus(conn) != CONNECTION_OK) {

        fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));

        PQfinish(conn);

        exit(1);

    }


    // SQL 쿼리 실행 (예시)

    res = PQexec(conn, "SELECT * FROM mytable");


    // 쿼리 결과 상태 확인

    if (PQresultStatus(res) != PGRES_TUPLES_OK) {

        fprintf(stderr, "SELECT command did not return tuples properly: %s", PQerrorMessage(conn));

        PQclear(res);

        PQfinish(conn);

        exit(1);

    }


    // 결과 필드 수 확인

    nFields = PQnfields(res);


    // 결과 출력

    for (i = 0; i < PQntuples(res); i++) {

        for (j = 0; j < nFields; j++)

            printf("%s\t", PQgetvalue(res, i, j));

        printf("\n");

    }


    // 결과 해제

    PQclear(res);


    // 연결 종료

    PQfinish(conn);


    return 0;

}


OUT 파일로 만들면 정상적으로 실행이 되는데 

SO 파일로 만들면 세그멘테이션 오류가 발생합니다.


 ldd lib20240714_postgresql.so

        linux-vdso.so.1 =>  (0x00007ffe16be3000)

        libpq.so.5 => /usr/pgsql-11/lib/libpq.so.5 (0x00007ff6fae4d000)

        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007ff6fab46000)

        libm.so.6 => /lib64/libm.so.6 (0x00007ff6fa844000)

        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ff6fa62e000)

        libc.so.6 => /lib64/libc.so.6 (0x00007ff6fa260000)

        libssl.so.10 => /lib64/libssl.so.10 (0x00007ff6f9fee000)

        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007ff6f9b8d000)

        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007ff6f9940000)

        libldap_r-2.4.so.2 => /lib64/libldap_r-2.4.so.2 (0x00007ff6f96e1000)

        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff6f94c5000)

        /lib64/ld-linux-x86-64.so.2 (0x00007ff6fb299000)

        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007ff6f91dd000)

        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007ff6f8fd9000)

        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007ff6f8da6000)

        libdl.so.2 => /lib64/libdl.so.2 (0x00007ff6f8ba2000)

        libz.so.1 => /lib64/libz.so.1 (0x00007ff6f898c000)

        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007ff6f877e000)

        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007ff6f857a000)

        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ff6f8361000)

        liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007ff6f8152000)

        libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007ff6f7f35000)

        libssl3.so => /lib64/libssl3.so (0x00007ff6f7ce7000)

        libsmime3.so => /lib64/libsmime3.so (0x00007ff6f7ac0000)

        libnss3.so => /lib64/libnss3.so (0x00007ff6f7793000)

        libnssutil3.so => /lib64/libnssutil3.so (0x00007ff6f7564000)

        libplds4.so => /lib64/libplds4.so (0x00007ff6f7360000)

        libplc4.so => /lib64/libplc4.so (0x00007ff6f715b000)

        libnspr4.so => /lib64/libnspr4.so (0x00007ff6f6f1d000)

        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007ff6f6cf6000)

        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff6f6abf000)

        librt.so.1 => /lib64/librt.so.1 (0x00007ff6f68b7000)

        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007ff6f6655000)

        libfreebl3.so => /lib64/libfreebl3.so (0x00007ff6f6452000)


경로도 정상적으로 잡고 있는데 


./lib20240714_postgresql.so 이렇게 실행하면 세그멘테이션 오류로 발생하고 

Visual studio에서도 so 파일은 생성되지만 세그멘테이션 오류로 팝업 창이 발생합니다.


gdb로 실행하면 아래와 같이 나오는데 확인 부탁드립니다.

해당 라이브러리를 Postgresql에서 정상 호출된다면 

비밀번호 재사용방지, 로그인 실패횟수 체크 등 기능을 추가적으로 개발하려고 합니다.


gdb ./lib20240714_postgresql.so

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7

Copyright (C) 2013 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-redhat-linux-gnu".

For bug reporting instructions, please see:

...

Reading symbols from /root/projects/20240714_postgresql/bin/x64/Release/lib20240714_postgresql.so...done.

(gdb)


 

이 글에 대한 댓글이 총 1건 있습니다.

so 파일은 동적 라이브러리 파일입니다. (리눅스쪽 관례)

그래서, so 파일을 만들 때는 gcc 컴파일러를 이용한다면, -shared 옵션을 추가해서 만들고, 

그걸 다른 실행 파일 소스랑 같이 빌드할 때 -l 옵션으로 추가 지정하는 식입니다. 

-lpq 처럼.


하려고 하는 것이, 

PostgreSQL 서버로 클라언트가 접속할 때 그 접속 계정(로그인 role)의 비밀번호 재사용방지, 로그인 실패횟수 체크 같은 것을 추가 개발하겠다면, 

서버의 기본 비밀번호 인증 부분의 코드를 수정하는 것이 맞습니다. 


그런데, PostgreSQL의 철학이 그런 것이 필요하면, ldap이나, kerberos 같은 전용 인증서버를 사용하는 것이 낫기 때문에, 그쪽 인증을 연결하는 방법을 제공하겠다고 하고, 그렇게 하고 있습니다. 


이미 훌륭한 인증서버들이 많이 있습니다. 

김상기(ioseph)님이 2024-07-19 10:37에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10486동일한 쿼리가 psql, spring(mybatis)에서 동작이 다른 원인 문의 [2]
조심1
2024-08-27
81
10485PPAS TO PostgreSQL Mig 가이드 없을까요? [1]
한가람
2024-07-31
142
10484postgresql 16에서 Active-Active 구성에 관한 공식 문서가 있을까요? [1]
구재호
2024-07-16
188
10483동적라이브러리 만들기 관련해서 문의드립니다. [1]
박준영
2024-07-16
163
10482Postgresql 대소문자 구분 없이 설치 [5]
송정국
2024-07-11
212
104819.4버전의 with절 [3]
정민욱
2024-06-25
252
10480PostgreSQL tablespace 에 대해 제가 이해한 바가 맞나요? [2]
말차프라페
2024-06-04
324
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다