[질문] 라이브러리 링킹과 아키브 병합의 차이

partout의 이미지

아래 어떤 글을 보니깐...

Quote:
1. gcc -o tcp2 tcp2.c /usr/lib/libnet.a

Quote:
2. gcc -o tcp2 tcp2.c -lnet

'인용 1의 경우 단순히 아키브를 병합하는 것이기 때문에 링킹 작업이 제대로
이뤄지지 않는다. 따라서 일반적으로 이와 같이 쓰지 않고,
인용 2와 같이 쓰는 것이 옳다'라는 글이 있더군요...

그 차이를 좀 자세하게 설명해 주실 수 없을까요?

송지석의 이미지

.a를 링킹하면 실행파일 안에 라이브러리의 내용을 넣게 됩니다. 스태틱 링크라고 생각하시면 됩니다. ==> 용량이 커지고 공유 라이브러리를 안쓰니 라이브러리가 시스템에 없어도 실행될 수 있습니다.

-l로 링킹하면 윈도에서 dll 링크하는 것 처럼 공유 라이브러리 링크를 하게 됩니다. 나중에 실행 될 때 시스템에 있는 라이브러리 파일을 찾아서 메모리에 같이 올리고 실행하게 됩니다.

sunyzero의 이미지

링킹과정에서는(특별히 옵션을 주지 않는한) 두개의 라이브러리를 순서대로 찾습니다. :shock:

우선적으로 shared object라 불리는 lib*.so 들을 찾아서 있으면 이들과 링킹을 합니다. 이들과 링킹되는 경우는 심볼만 가지고 링킹하므로 실행시에 찾아서 라이브러리가 메모리에 로딩됩니다.

근데 이녀석이 없다면 lib*.a 즉, archive라고 불리는 녀석을 찾아서 병합합니다. 이렇게 되면 실행파일의 크기가 커지게 됩니다. 그 차이를 윗분이 간명하게 말씀해주신 것입니다.

어느것이 더 좋다라고는 할 수 없지만, so를 사용하는 것이 실행파일의 크기를 줄일 수 있고, 버전이 크게 바뀌지 않는다면 버전이 올라가는 것에 따라서 성능도 달라질 수도 있고...하핫~ 하여간 so를 사용하시는게 좋습니다.

========================================
* The truth will set you free.

익명 사용자의 이미지

병합은 잘못된 표현이고 정적 링크가 맞는 말입니다.

partout의 이미지

먼저 답변 감사 드립니다. ^^
근데, 제 질문이 좀 허술했던 모양이네요.

다시 질문 드릴께요.

제가 궁금했던 건...
이전 글들 중에
gcc -o tcp2 tcp2.c /usr/lib/libnet.a
와 같이 아키브를 병합하는 것과
gcc -o tcp2 tcp2.c -lnet (libnet.so가 없는 경우)
을 실행해 libnet.a를 정적으로 링크하는 것이 다르다고 해서...
이것을 확인하려고 했던 겁니다.
원래 질문에서 인용했던 부분 "'인용 1의 경우 단순히 아키브를 병합하는
것이기 때문에 링킹 작업이 제대로 이뤄지지 않는다."라는 말의 뉘앙스가
그렇게 쓰면 문제가 생길 수 있다는 것을 암시하는 것처럼 들렸습니다.

사실 전 정적으로 링크되는 거면.. 둘 사이에 차이가 없는 걸로 알고 있었거든요.

답변 부탁드립니다.

어찌나 졸린지..~~

cjh의 이미지

.so가 없는 상태에서 라이브러리 탐색 경로에 .a만 있으면 그냥 libxxx.a라고 쓰는거랑 -lxxx 라고 쓰는거랑 다를게 없습니다.

기본 설정이 .so를 선호하도록 되어 있을 뿐이지요. 이것도 -static 같은 옵션을 주면 바꿀 수 있습니다.

--
익스펙토 페트로눔

댓글 달기

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