ELF 의 PLT, GOT 그리고 동적라이브러리에대한 질문

declspec의 이미지

안녕하세요

요즘들어 제가 알고있는 리눅스 동적라이브러리에 대해 혼란이 생겨 질문드립니다
잘못 알고있는 부분 있으면 지적과 정정 부탁드립니다

1. 정적라이브러리를 사용하는 바이너리
gcc 에서 -static 옵션으로 컴파일한 ELF 바이너리로서 사용하는 라이브러리의 코드가
파일상에 박혀있고 로더에 의해 메모리에 로드될때 고정된 가상메모리 위치에 전부 매핑된다.
PLT, GOT 가 필요없다(근데 readelf 로 보면 섹션이 나오는데 왜있는지 모르겠다)
장점 : 라이브러리 의존성등의 문제가 단순해짐. 라이브러리 사용속도가 빠름
단점 : 파일사이즈가 커짐. 메모리상에 올라갔을때도 다른 코드들과 라이브러리 공유를 못함. 라이브러리 수정하려면 재컴파일해야됨

2. 동적라이브러리를 사용하는 바이너리
gcc 에서 기본적으로 컴파일한 ELF 바이너리.
파일상에 라이브러리 코드가 없고, 로더에 의해서 메모리에 프로그램이 적재되어도
메모리상에 라이브러리 코드가 없음. 라이브러리 호출하는 함수들은 모두 PLT 로 점프하게 되어있음
최초로 라이브러리 함수를 호출하면 그때 동적링커함수를 호출하면서 동적링커에게
자신이 호출하고싶은 라이브러리 함수가 뭔지를 알려주면(어떻게 알려주는지느 잘모름... 궁금함) 동적링커함수가
그제서야 파일시스템 상에서 해당 라이브러리파일을 메모리에 매핑시키고 GOT 상에
주소를 채워넣음.
장단점 -> 정적라이브러리 쓰는경우와 반대

3. 궁금한점.
libc.so 같은경우 그 속에 1000개의 라이브러리 함수가 있다고 가정합시다.
그런데 프로램은 단지 그중에 1개의 함수만 사용하려한다면 libc.so 의 모든 1000개의 함수들을
가상메모리에 매핑시키는건 비효율적인거 아닐까요?
실제로 리눅스에서는 libc 라이브러리 내의 어떠한 함수에 대한 참조라도 이루어지면
그시점에서 1000개의 함수가 모두 메모리에 매핑되나요?

4. ASLR 은 동적라이브러리들을 프로그램이 실행될때마다 다른 위치에 매핑하는 기법입니다
그런데 이것이 libc 파일 전체를 매핑하는 위치가 랜덤인건가요? 아니면 libc 내의 모든
함수 하나하나의 위치가 제각각 랜덤인건가요?
ASLR 을 위해서 사용되는 randomness 는 어떻게 얻어지나요?
/dev/urandom 을 이용할까요?

좋은답변 기대해봅니다~

댓글 달기

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