library의 soname에 대한 질문...

mg2000의 이미지

soname이라는 것이 so간의 호환성을 위해 존재하는 것으로 알고 있는데요.

예를 들어, AAA.so.1.1이라는 라이브러리를 만들고, soname은 AAA.so.1로 지정을 했다면,

이것을 사용하기 위해 AAA.so.1과 AAA.so라는 심볼릭 링크를 만들어서, AAA.so.1.1을 가리키게 만드는데요.

이렇게 잘 쓰다가 AAA.so.1.2(soname은 그대로 AAA.so.1)를 새로 만들어서, 업데이트 된 버전을 사용하려고

한다면, AAA.so.1과 AAA.so가 AAA.so.1.2를 가리키도록 링크를 다시 만들어야 되는 건데요.

이 작업은 굳이 soname을 지정하지 않고 사용하더라도 별 차이가 없는 것 같은데요.

뭔가 제가 잘못 이해하고 있는 부분이 있는건지,

soname을 쓰는 목적이 정확히 무엇인가요?

bushi의 이미지

mg2000 wrote:

soname이라는 것이 so간의 호환성을 위해 존재하는 것으로 알고 있는데요.
예를 들어, AAA.so.1.1이라는 라이브러리를 만들고, soname은 AAA.so.1로 지정을 했다면,

질문에 답이 포함되어 있으므로 다른 답변이 달릴 것 같지 않습니다.
정확히 말하면...
so 개발자의 뜻대로 사용할 수 있으며, 보통은 API 호환성을 명시적으로 링커에게 알려줘서 투명한 버전관리가 되도록 하는데 사용합니다.

GNU binutils 중 ld 매뉴얼을 한번 읽어보세요.

soname 에 major 버전만 포함할 경우(다시말해 같은 major 버전에서는 API 호환성을 보장하도록 so 를 개발할 경우),
*.so 는 compile-time
*.so.? 는 run-time 에 참조됩니다.

*.so 는 링커가 사용하는 스크립트일 수도 있습니다.
(/usr/lib/libc.so 를 보세요)

soname 을 생략하면, MS DLL 처럼 오직 파일이름에만 의존하게 됩니다.

libdl 을 사용하면 soname 을 무시하고, 수동으로 심볼을 찾아 연결시킬 수 있습니다.
돌아가던 말던.

OTL

mg2000의 이미지

예를들어, AAA.so.1.1 이라는 라이브러리를 만들고,

AAA.so.1을 soname으로 지정했습니다.

그런다음 AAA.so.1이라는 심볼릭 링크를 만들어, AAA.so.1.1을 가리키고,

AAA.so라는 심볼릭 링크를 만들어, AAA.so.1을 가리키도록 만들어서 사용했습니다.

(TEST라는 모듈에서, AAA.so를 참조)

그러다 AAA.so.2.0(soname은 AAA.so.2)라는 파일이 생겨서,

AAA.so.2라는 심볼릭 링크로 AAA.so.2.0을 가리키도록 하고,

기존의 AAA.so는 AAA.so.2를 가리키도록 수정했습니다.

그렇다면 TEST가 AAA.so를 참조하게 되면, AAA.so.2.0을 사용하게 될 터이고,

이전에 사용하던 라이브러리의 soname과 달라서, 에러를 뱉어야 되는 것 아닌가 생각되는데요.

잘 돌아가더라고요...

soname이 있으면 뭔가 자동화(?)되는게 있는 줄 알았는데, 그냥 사용자가 참고만 하는 것인지...

bushi의 이미지

구간반복.

AAA.so 는 컴파일 타임 때 참조됩니다. -lAAA 라는 ldflag 에 의해서요.
AAA.so 가 AAA.so.1.0.0 에 대한 링크였고,
AAA.so.1.0.0 의 soname 이 AAA.so.1 이었다면,
컴파일 된 TEST 파일에는 AAA.so.1 이라는 이름이 기억됩니다.

TEST 파일을 실행시킬 때 loader 가 쓰~윽 보고는 AAA.so.1 을 찾습니다.
AAA.so.1 이 AAA.so.1.0.0 에 대한 링크였고,
AAA.so.1.0.0 의 soname 이 AAA.so.1 이었다면 이상없이 진행됩니다.
AAA.so.1 이 AAA.so.2.0.0 에 대한 링크라면
soname 은 AAA.so.2 일 테고, 찾는 게 아니게 되겠지요.
그래서 AAA.so.1 so를 찾을 수 없다는 에러메시지를 뿌리고 파일을 실행하기를 거부합니다.

테스트 해보시려면... ldd 스크립트를 사용하시거나 로더를 직접 실행해보셔도 됩니다.

[bushi@rose kernel-2.6.21]$ ldd /bin/ls
        linux-gate.so.1 =>  (0x00110000)
        librt.so.1 => /lib/librt.so.1 (0x00136000)
        libselinux.so.1 => /lib/libselinux.so.1 (0x00141000)
        libacl.so.1 => /lib/libacl.so.1 (0x02f72000)
        libc.so.6 => /lib/libc.so.6 (0x00af3000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00c90000)
        /lib/ld-linux.so.2 (0x00ad4000)
        libdl.so.2 => /lib/libdl.so.2 (0x00c74000)
        libsepol.so.1 => /lib/libsepol.so.1 (0x0018d000)
        libattr.so.1 => /lib/libattr.so.1 (0x03963000)
[bushi@rose kernel-2.6.21]$ 
 
[bushi@rose kernel-2.6.21]$ /lib/ld-linux.so.2 --list /bin/ls
        linux-gate.so.1 =>  (0x00110000)
        librt.so.1 => /lib/librt.so.1 (0x00136000)
        libselinux.so.1 => /lib/libselinux.so.1 (0x00141000)
        libacl.so.1 => /lib/libacl.so.1 (0x02f72000)
        libc.so.6 => /lib/libc.so.6 (0x00af3000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00c90000)
        /lib/ld-linux.so.2 (0x80000000)
        libdl.so.2 => /lib/libdl.so.2 (0x00c74000)
        libsepol.so.1 => /lib/libsepol.so.1 (0x0018d000)
        libattr.so.1 => /lib/libattr.so.1 (0x03963000)
[bushi@rose kernel-2.6.21]$

더 이상 어떻게 자동화를... ?
혹 패스를 전부 뒤져 soname 이 AAA.so.1 인 so를 찾아서 자동으로 로드하는... 그런 것을...?

OTL

댓글 달기

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