ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 gcc 빌드시 Undefined reference to dlopen 에러
    C and C++ 2019. 11. 18. 13:37

    static Library를 포함하는 타겟 바이너리를 빌드하는 중에 황당한 에러를 만났다.

    ~/xxxlib.so: Undefined reference to 'dlsym'
    ~/xxxlib.so: undefined reference to `dlsym'
    ~/xxxlib.so: undefined reference to `dlerror'
    ~/xxxlib.so: undefined reference to `dlopen'
    ~/xxxlib.so: undefined reference to `dlclose'


    링크에 실패한 dlxxx 함수는 다이나믹 라이브러리를 런타임에 사용하기 위한 함수이다. (참조)
    기억을 더음으며 소스코드를 살펴보니 빌드시 포함시킨 static library 중 하나에 dl계열 함수가 들어있었다.
    gcc가 이 함수들을 찾지 못해서 에러가 난 것이었다.

    흐릿한 기억으로는 이 함수들이 libc에 구현이 되어 있었던 것 같은데 이상한 일이었다.
    크로스컴파일을 하는 것도 아닌데 왜 libc 함수를 못 찾아서 에러가 날까...
    원인이 궁금하긴 했지만, 리눅스는 워낙 이상한 일이 많으니 해결책을 찾는데 집중했다.

    다음은 해결책이다.
    src.cpp를 컴파일하여 mytarget을 생성하기 위해 somestatic 정적 라이브러리를 링크하는 상황, 
    그리고 somestatic 라이브러리에는 dl 시리즈 함수가 dso 코드에 사용되고 있음을 가정한다.

    g++ src.cpp -o mytarget -lsomestatic -ldl


    -ldl 옵션을 추가해주면 컴파일러가 /usr/lib/libdl.so를 인지하여 dl계열 함수가 링크 가능함을 알게된다.
    이를 통해 문제없이 빌드가 이루어진다.

    최신 컴파일러를 이용할 경우 -ldl만으로 안되는 경우가 있는데, 
    이는 최근 gcc가 --as-needed 링커 옵션을 기본적으로 켜놓기 때문이다.
    --no-as-needed 링커 옵션을 추가하는 것으로 문제가 해결될 수 있다.

     

    g++ src.cpp -o mytarget -lsomestatic Wl,--no-as-needed -ldl

     


    Fin.

    반응형

    댓글

Calvin's Memo