[질문] dlopen

bizzare의 이미지

dlopen을 쓰는데 정말 괴롭습니다.

libTest.so 라는 파일을 만들어서 로드하는데,

dlopen("libTest.so", RTLD_LAZY);

로 로드하고 있습니다.

그런데 어쩔 때는 로드되고 어쩔 때는 로드가 안되는군요 -_-;
제 생각에 로드되는 순간의 working directory가 영향을 주는 것 같아서 full path 로

dlopen("/home/user/test/libTest.so");

로 호출을 했더니

아예 로드가 안되는군요. -_-;

Full Path는

지원이 안되는 것인가요? -_-;

또한 문제없이 로드가 잘 되려면 어떻게 해야하나요?

참고로 dlopen소스가 포함된 실행파일은

LD_LIBRARY_PATH=:/home/user/test/:$LD_LIBRARY_PATH a.out

로 하여 실행하고 있습니다.

bizzare의 이미지

bizzare wrote:

IBM에서 dlopen을 쓰는데 정말 괴롭습니다.

libTest.so 라는 파일을 만들어서 로드하는데,

dlopen("libTest.so", RTLD_LAZY);

로 로드하고 있습니다.

그런데, 제가 추측하건데 동적 라이브러리의 로드가
링크옵션을 줄 때 준 path가 결정적인 역할을 하는 듯 합니다.

LD_LIBRARY_PATH와는 무관하게,

오직 링크시에 -L 옵션으로 준 path에서만 라이브러리를 찾는 듯 하군요.

예를 들어 xlC -L/home/temp -lmy -o a.out test.o
라고 하면

실행시에도
libmy.so를 오직 /home/temp/에서만 검색하는 듯 합니다.

제 생각에 LD_LIBRARY_PATH 등에 있는 라이브러리도 쓰도록 하는 옵션이 있을 것 같은데 혹시 아시는 분은 알려주세요. :-)

정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.

익명 사용자의 이미지

OS390이나 AIX에서는 LIBPATH를 사용합니다.

* 참고로, 다른 시스템에서 LD_LIBRARY_PATH 를 좀 ... 많이 쓰지요.

익명 사용자의 이미지

....
---------------------------
2. 참고.
1) 공유라이브러리 경로지정을 위한 운영체제별 차이.
* 리눅스 : LD_LIBRARY_PATH
* 솔라리스 : LD_LIBRARY_PATH , LD_LIBRARY_PATH_64
* HPUX : SHLIB_PATH, LD_LIBRARY_PATH
* Tru64 : LD_LIBRARY_PATH
* AiX : LIBPATH
* SGI : LD_LIBRARY_PATH, LD_LIBRARYN32_PATH, LD_LIBRARY64_PATH
* Win32 : PATH
* MacOS X : DYLD_LIBRARY_PATH, DYLD_FALLBACK_LIBRARY_PATH
* VMS :SYS$SHARE
* OS390 : LIBPATH
-----------------------------------
...

niemand의 이미지

글을 올렸었는데 틀린 내용이 있어서 전부 정정합니다..
지난 글은 잊어주세요 ^^;;;

저는 리눅스에서 테스트를 했구요
/home/me/libadd.so 로 파일을 만들었구요

test.c 라는 파일을 만들어서 아래 내용을 코딩하고

#include <stdlib.h>
#include <dlfcn.h>

int main()
{
    void *handle;
    int (*Func)();

    handle = dlopen("/home/me/libadd.so", RTLD_LAZY);
    Func = dlsym(handle,"Add");
    (*Func)();
}

gcc -o test test.c -ldl

로 컴파일하고 돌리면 그냥 잘 돕니다.

LD_LIBRARY_PATH 같은 것은 전혀 설정하지도 않았습니다.

익명 사용자의 이미지

niemand wrote:
글을 올렸었는데 틀린 내용이 있어서 전부 정정합니다..
지난 글은 잊어주세요 ^^;;;

저는 리눅스에서 테스트를 했구요
/home/me/libadd.so 로 파일을 만들었구요

test.c 라는 파일을 만들어서 아래 내용을 코딩하고

#include <stdlib.h>
#include <dlfcn.h>

int main()
{
    void *handle;
    int (*Func)();

    handle = dlopen("/home/me/libadd.so", RTLD_LAZY);
    Func = dlsym(handle,"Add");
    (*Func)();
}

gcc -o test test.c -ldl

로 컴파일하고 돌리면 그냥 잘 돕니다.

LD_LIBRARY_PATH 같은 것은 전혀 설정하지도 않았습니다.

익명 사용자의 이미지

linux라면, ldconfig를 사용해서 LD_LIBRARY_PATH에 등록하지 않고 사용할 수 있는데, 아마도 그 경우로 보입니다.

# /sbin/ldconfig -v 로 확인해 보시기 바랍니다.

bizzare의 이미지

많은 도움이 되었습니다. :-) :)

정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.

kdoll의 이미지

AIX에서 동적 라이브러리가 .so파일이였던가요?

오래된 제 기억속에는 .a라는 이름이였던 걸로 기억합니다.
(어처구니 없죠? 일반 static lib랑 동일하니..)

/usr/lib를 살펴보시면 libc.so가 존재하는지 어떻게 되어 있는지

확인한번 해보세요. libc.a파일만 존재하면 뭐 두말할 필요도

없겠지요..

저도 맨처음 동적 라이브러리 만들면서 당황했다는

그리고 AIX에서 dlopen사용시 LD_LIBRARY_PATH랑은 전혀 상관없었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.