동적 라이브러리에 대한 질문

dcmru의 이미지

제가 한 작업은 이렇습니다.

솔라리스를 예로 들면, Version 0.9.5 pcap 정적, 동적 라이브러리 패키지를 받아

pkgadd 를 사용하여 설치를 하였습니다.

/usr/local/lib 에 libpcap.a 와 libpcap.so 가 생겼습니다.

여기서 libpcap.so를 libpcap.so.0.9.5 로 이름을 변경하고,

ln -s libpcap.so.0.9.5 libpcap.so.0
ln -s libpcap.so.0.9.5 libpcap.so 를 만들었습니다.

그리고, 컴파일 한 후 ldd로 오브젝트를 보니, 참조하는 라이브러리가

libpcap.so -> /usr/local/lib/libpcap.so 를 참조합니다.

정상적인 현상인 것인가요?

왜 /usr/local/lib/libpcap.so.0.9.5 를 참조안하는 것일까요?

bushi의 이미지

GNU 가 아니면 낭패.

.so 는 컴파일타임에 링커가 참조하는 라이브러리 혹은 스크립트 입니다.
.so.0 따위는 런타임에 링커가 참조하는 라이브러리 입니다.

보통은요.

위 둘을 구분하기 위해 실제 라이브러리를 만들어 낼 때
gcc -Wl,-soname,libpcap.so.0 -o libpcap.so.0.9.5
처럼 이름을 박아 넣습니다.

이렇게 라이브러리에 이름을 박아 넣으면,
컴파일 타임에는 libpcap.so 를 찾지만 런타임에는 libpcap.so.0 를 찾게됩니다.

덧.

라이브러리 버전을 왜 이름에 박아넣는 것이냐는 의문을 가지신다면,

라이브러리 버전의 첫번째 숫자는 major 버전이고, 보통은 API 의 급격한 변화로 바이너리 호환성이 없게될 때 변경됩니다.
두번째 숫자는 minor 버전이고, 보통은 기존 API 가 별 변화없이 유지됩니다.
세번째 숫자는 patch 레벨이고, 버그픽스죠 ;;
그래서 라이브러리의 internal name에 버전까지 박아넣을 경우 대부분 major 버전까지만 포함시킵니다.
API 의 변화가 생길 경우 major 버전이 바뀔 테고, 결국 기존에 컴파일 된 다른 것들이 런타임에 새로운 라이브러리 참조를 못하게 되는 결과가 발생합니다. 실행이 안되죠. 의도한대로입니다.

언젠가.. 'MS PE 에서는 리소스를 활용해서 라이브러리(dll)에 버전을 넣고 관리하기 때문에 편하다... 리눅스는 없느냐' 라는 질문을 봤습니다. MS PE 에서 dll 의 "파일 이름" 외에 바이너리 API 호환성을 투명하게 보장하는 뭔가가 있습니까 ?

dcmru의 이미지

딥변 감사드립니다.

이해가 되었습니다. mv 로 이름만 바꾸어도 soname은 변경이 되지 않는 것이었군요.

soname을 변경할려면 제가 따로 컴파일을 해야되는 것이군요.

의존성 때문에 컴파일하기 귀찮아서 그냥 패키지를 받았는데... ㅡㅡㅋ

고민을 해야겠습니다. 어일을 어찌할꼬 ^^;

아 그리고 혹시 답이 될지는 모르겠으나 아래 링크글을 한 번보세요.

http://ko.wikipedia.org/wiki/DLL_%EC%A7%80%EC%98%A5

저도 dll을 써본적이 없어서 경험에 의한 답을 드릴수가 없네요.
----------------
노력만이 살길이다.

노력만이 살길이다.

bushi의 이미지

링크 잘 읽었습니다.
혹여 링크된 것을 읽지 않는 버릇을 가진 분이 계실까 제목만 간단히 옮기겠습니다.

"DLL 지옥"

체스맨의 이미지

MS 가 제시하는 일정 수준의 DLL 지옥을 극복하는 정책은 있습니다만, 결국 공유라이브러리라는 개념때문에 나타나는 근본적인 문제는 어떤 플렛폼이나 동일합니다. 단지 윈도 점유율이 높기 때문에 DLL 지옥이라 불릴 뿐이죠.

DLL 지옥을 극복할 수 있는 가장 좋은 해결책은 뭐니뭐니해도,

소스가 공개되는 것입니다.

그건 MS 로서는 향후 긴 기간동안 할 수 없는 일이지만, GNU/리눅스쪽은 이미 하고 있는 일이지요.

( 혹시라도 오해가 있을까봐... 소스가 공개되는게 좋다 나쁘다가 아니라, DLL 지옥 측면에서 그렇다는 얘깁니다. )

Orion Project : http://orionids.org

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.