ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • readelf – useful command than ldd
    2015. 11. 30. 0 comments

    얼마 전 테스트 때문에 openSSL 버전 변경을 위해서 임시로 동적 라이브러리를 정적 라이브러리 참조로 변경하였다.

    재 빌드 후, ldd 명령으로 동적 라이브러리 참조가 없어졌는지 확인해보려고 했지만 그대로 남아있었다.

     

    root@tmp:~/# ldd sample | grep ssl

    libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007f67639c0000)

     

    정적 라이브러리를 참조하도록 빌드 옵션등을 다 변경하고 빌드까지 완료했는데 왜 ldd에서 해당 내용이 나오는걸까? 

    몇 번을 반복하고 빌드 옵션을 다시 살펴봐도 결과는 계속 동일 했었다.

     

    무엇이 문제일까 고민을 하다가 결국 파일을 직접 열어보기로 했다.

     

     

     

    readelf

     

     

    root@tmp:~/# readelf -d sample

     

    Dynamic section at offset 0x6ec628 contains 72 entries:

      Tag        Type                         Name/Value

     0x0000000000000001 (NEEDED)             Shared library: [libna.so.0]

     .

     .

     .

     0x0000000000000001 (NEEDED)             Shared library: [libboost_regex.so.1.42.0]

     0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]

     0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]

     0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]

     0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

     0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]

     0x000000000000000c (INIT)               0x4d0cc0

     0x000000000000000d (FINI)               0x82d198

     0x0000000000000004 (HASH)               0x400260

     0x000000006ffffef5 (GNU_HASH)           0x4123f8

     0x0000000000000005 (STRTAB)             0x462588

     0x0000000000000006 (SYMTAB)             0x425dd8

     0x000000000000000a (STRSZ)              411885 (bytes)

     0x000000000000000b (SYMENT)             24 (bytes)

     0x0000000000000015 (DEBUG)              0x0

     0x0000000000000003 (PLTGOT)             0xced368

     0x0000000000000002 (PLTRELSZ)           12312 (bytes)

     0x0000000000000014 (PLTREL)             RELA

     0x0000000000000017 (JMPREL)             0x4cdca8

     0x0000000000000007 (RELA)               0x4cc070

     0x0000000000000008 (RELASZ)             7224 (bytes)

     0x0000000000000009 (RELAENT)            24 (bytes)

     0x000000006ffffffe (VERNEED)            0x4cbf20

     0x000000006fffffff (VERNEEDNUM)         7

     0x000000006ffffff0 (VERSYM)             0x4c6e76

     0x0000000000000000 (NULL)               0x0

     

    참조 내용이 없다. 실제로 실행파일에 동적 라이브러리 참조가 포함되어 있지 않았다.

     

    정적 라이브러리 참조라면 수많은 ssl 함수들을 포함할 것이기 때문에 ssl 심볼을 얼만큼 갖고 있는지 확인해보았다. 

     

    root@tmp:~/# readelf -s sample  | grep ssl | wc -l

    548

     
    아, 굉장히 많은걸 보니 정적 라이브러리 참조가 잘 된 것으로 보인다. 명쾌하게 확인이 되었다. 
     
    라이브러리 의존성 확인에 있어서 ldd 뿐만 아니라 readelf등을 활용해보자. 다양한 시스템 도구를 알고 다뤄야 한다. 
     

     

    반응형

    댓글 0

Designed by Tistory.