홈 > IT > IT정보
IT정보

ELF 파일 기초 정리 2

2 realdragonhead 0 454 1 0

ELF 파일 기초 정리 1에 이어 정리하는 글입니다. 링크 : http://www.hacure.com/bbs/board.php?bo_table=tip&wr_id=102


ELF 파일 기초 정리 2


가. 섹션 헤더 테이블(Section Header Table) 

    - 오브젝트 파일의 섹션 헤더 테이블은 모든 파일의 섹션을 한 곳에 위치시킨다.

    - elf_header 의 e_shoff 는 파일의 시작으로부터 섹션 헤더 테이블의 위치의 오프셋 값을 바이트 단위로 저장하고 있다.

    - elf_header 의 e_shnum 는 오브젝트 파일의 섹션 헤더 테이블의 섹션 엔트리의 수를 저장하고 있다.

    - elf_header 의 e_shentsize 는 오브젝트 파일의 섹션 헤더 테이블의 하나의 엔트리의 크기를 저장하고 있다.

    - elf_header 의 e_shnum * e_shentsize 의 값은 섹션 헤더 테이블의 총 엔트리 크기를 알 수 있다.


나. 섹션(Section)

    - elf 헤더, 프로그램 헤더 테이블, 섹션 헤더 테이블을 제외한 오브젝트 파일의 모든 정보를 포함한다.

    - 오브젝트 파일 내의 각각의 섹션은 반드시 하나의 섹션 헤더를 가지게 된다. 하지만 섹션 헤더가 존재한다고 섹션이 존재하는 것은 아니다.

    - 섹션은 하나의 이어진 덩어리 형태로 파일 안에서 존재하는데, 중간 중간 비어있는 공간이 있을 수도 있다.

    - 파일의 섹션은 겹쳐진 형태가 될 수 없다(섹션이 공유하는 바이트가 있을 수가 없다.). 한 바이트라도 겹쳐진 형태가 될 수 없다.


다 .섹션 헤더(Section header)의 구조


1. Section header

    - 구조체 구조는 다음과 같다.

    typedef struct {

        Elf64_Word sh_name;

        Elf64_Word sh_type;

        Elf64_Word sh_flags;

        Elf64_Addr sh_addr;

        Elf64_Off sh_offset;

        Elf64_Word sh_size;

        Elf64_Word sh_link;

        Elf64_Word sh_info

        Elf64_Word sh_addralign;

        Elf64_Wordsh_entsize;

    }


    1-1. sh_name

        - 섹션 헤더의 스트링 테이블 섹션의 인덱스를 저장하고 있으며, 끝에 널문자가 들어간 형태의 문자열의 위치로 저장된다.


    1-2. sh_type

        - 섹션헤더의 저장된 내용등을 표현하는 정보들을 분류해놓은 곳이다. 몇가지 예를 들면 아래와 같다.

            0 SHT_NULL : 섹션 헤더 비활성화

            1 SHT_PROGBITS : 섹션이 프로그램 데이터를 갖는다.

            2 SHT_SYMTAB : 섹션이 심볼 테이블을 갖는다.

            3 SHT_STRTAB : 섹션이 문자열을 갖는다.

            4 SHT_RELA : 섹션이 재배치 엔트리를 갖는다.

            5 SHT_HASH : 섹션이 심볼 해시 테이블을 갖는다.

            6 SHT_DYNAMIC : 동적 링크 정보.

            7 SHT_NOTE : 호환 정보를 체크한다.

            8 SHT_NOBITS : 파일 상에 데이터가 없는 부분을 의미한다.(.bss 와 같은 개념)


    1-3. sh_flags

        - 속성을 담고 있는 플래그인데 비트 단위로 표현을 한다.


    1-4. sh_addr

        - 섹션이 프로세스 메모리 이미지를 생성한다면, 이 헤더 값은 섹션의 첫번째 바이트 위치를 알려준다. 생성하지 않는다면 0값이 저장된다.


    1-5. sh_offset

        - 파일의 시작부터 지금 현재 섹션의 첫번째 바이트까지의 오프셋을 바이트 단위로 저장한다.


    1-6. sh_size

        - 섹션의 크기를 바이트로 나타낸다. 섹션 타입이 SHT_NOBITS 가 아니라면, 섹션의 sh_size 의 크기만큼 차지한다.

            ※위에 sh_type 에서도 다루지만 SHT_NOBITS 타입이라는 것은, 쉽게말해 .bss 섹션을 의미한다. 초기화 되지 않는 데이터들을 프로그램 메모리 이미지에 저장을 하는데, 프로그램이 작동을 시작하기 전에 0으로 초기화하고, 파일의 용량을 차지하지 않는 섹션이다. c언어에서 변수로 예를 들면, static 선언이 된 변수 또는 전역변수에 초기화를 하지 않는다면 .bss 섹션에 저장이 된다.


    1-7. sh_link

        - 섹션의 타입에 따라 달라지는 섹션헤더테이블의 인덱스를 결정한다.


    1-8. sh_info

        - 섹션의 타입에 따라 달라지는 섹션의 엔트리값을 결정한다.


    1-9. sh_addralign

        - 주소 정렬의 기준 값을 저장한다.


    1-10. sh_entsize

        - 몇몇 섹션은 고정된 크기의 엔트리를 가지는데, 그런 섹션에 대해 이 값은 엔트리의 크기를 바이트 단위로 저장한다. 섹션이 고정된 크기가 아니라면 0 값을 저장한다.


(추가)섹션헤더를 readelf -h 를 이용하여 elf header를 확인하고 그에 이어 readelf -l , readelf -S 등을 이용하여 od 명령어를 이용하여 원하는 부분을 읽어 정보값들을 확인해 볼 수 있지만, 다른 게시물에서 좀더 깊이 다루도록 하겠습니다.

0 Comments
Category
State
  • 현재 접속자 48 명
  • 오늘 방문자 219 명
  • 어제 방문자 721 명
  • 최대 방문자 948 명
  • 전체 방문자 127,466 명
  • 전체 게시물 1,618 개
  • 전체 댓글수 244 개
  • 전체 회원수 107 명
Facebook Twitter GooglePlus KakaoStory NaverBand