레이블이 ldd인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ldd인 게시물을 표시합니다. 모든 게시물 표시

Linux unixODBC isql 로 oracleodbc 접속시 SQLGetPrivateProfileStringW 에러 해결방법

// /etc/odbc.ini(또는 /usr/local/etc/odbc.ini) 에 OracleODBC-11g DSN 이 설정되어 있을경우
// isql 로 oracleodbc 에 접속할 경우 다음과 같이 SQLGetPrivateProfileStringW 를 찾을 수 없다는 에러가 발생한다
isql OracleODBC-11g
isql: symbol lookup error: /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1: undefined symbol: SQLGetPrivateProfileStringW

// 이것은 isql 과 libodbcinst.so 에서 사용하는 libodbcinst.so 의 버전이 달라서 발생한다.
// 다음을 보면 odbcinst 가 libodbcinst.so.2 => /usr/local/lib/libodbcinst.so.2 를 사용하는 것을 알 수 있다.
which odbcinst
/usr/local/bin/odbcinst
ldd /usr/local/bin/odbcinst
        libodbcinst.so.2 => /usr/local/lib/libodbcinst.so.2 (0x00002ae12059f000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003f88200000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003f88600000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003f87a00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003f87600000)

// 이제 libsqora.so.11.1(oracle odbc 드라이버) 에서 사용하는 odbcinst.so 의 버전을 확인해보면
// libodbcinst.so.1 => /usr/lib64/libodbcinst.so.1 를 사용한 것을 알 수 있다
ldd /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
ldd: warning: you do not have execution permission for `/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1'
        libdl.so.2 => /lib64/libdl.so.2 (0x00002aad43083000)
        libm.so.6 => /lib64/libm.so.6 (0x00002aad43287000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002aad4350a000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00002aad43726000)
        libclntsh.so.11.1 => /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 (0x00002aad4393e000)
        libodbcinst.so.1 => /usr/lib64/libodbcinst.so.1 (0x00002aad461cf000)
        libc.so.6 => /lib64/libc.so.6 (0x00002aad463e3000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003f87600000)
        libnnz11.so => /usr/lib/oracle/11.2/client64/lib/libnnz11.so (0x00002aad4673a000)
        libaio.so.1 => /usr/lib64/libaio.so.1 (0x00002aad46b06000)

// 따라서 libodbcinst.so.1 를 libodbcinst.so.2 으로 사용하도록 변경해 준다.
// 기존 링크는 삭제하고
sudo unlink /usr/lib64/libodbcinst.so.1


// 다음과 같이 libodbcinst.so.2 로 링크 걸어준다
sudo ln -s /usr/lib64/libodbcinst.so.2 /usr/lib64/libodbcinst.so.1

Linux 라이브러리 정보 확인 유틸 objdump, nm, ldd

# objdump 로 등의 오브젝트(라이브러리)의 정보를 확인할 수 있다.
objdump -a ./ysoftman.a

# nm 으로 오브젝트 파일의 심볼 목록을 볼 수 있다.
# (컴파일시 -g 옵션이 포함되어 있어야 함)
nm ./ysoftman.a

# ldd 로 프로그램에서 사용하는 공유 라이브러리를 확인할 수 있다.
ldd ./ysoftman.a

# mac 에선 ldd 대신 otool -L 을 사용하자
otool -L ./ysoftman.a

# assembly 코드 보기
# -c : 컴파일만하여 오브젝트 파일 생성
# -g : 소스레벨의 디버깅 정보 포함(소스 내용을 포함한다.)
g++ -c -g ysoftman.cpp

# -d : disassemble
# -S : disassembly 코드에 해당하는 소스코드 표시
objdump -dS ysoftman.o

# mac 에서는
objdump -disassemble -source ysoftman.o