본문 바로가기
코스웨어/15년 스마트컨트롤러

20151202 22번 우대희 업무일지

by 알 수 없는 사용자 2015. 12. 3.
728x90
반응형
>Memory Map과  Symbol이야기

symbol : 주소를 가지는 기본 단위
symbol이란 Linker가 알아볼 수 있는 기본 단위. Linker를 한 후에는 자신만의 주소를 갖게되는 특별한 단위

오브젝트를 만들 때는 일종의 가상주소가 사용된다. 실행파일을 만들 때 실제 주소가 적용된다.

다른 기계어 코드나 다른 오브젝트로 인해 문제가 생길 수 있다.

symbol의 이름은 그 symbol이 갖는 메모리 영역의 시작 주소

과거에는 변수의 주소 값이 고정되어 해킹이 매우 용이했다.

현재의 stack는 기준이 되는 주소를 정해놓고 변수를 +0, +4 등으로 처리한다.

실행 시킬 때 마다 기준이 되는 주소 값을 변환한다.

EBP 기준주소를 계속 바꾸기 때문에, 실행해야만 EBP 기준주소를 알 수 있다.
Linker가 각 Symbol들을 모아서 실행

오브젝트끼리 전역변수가 같은 상황이 발생하면 링커 에러가 발생하여 중단된다. symbol이 충돌

static을 사용하여 에러를 막을 수 있다.

같은 전역 변수라도 링커가 다른 위치에 위치시켜서 중복을 막는다.

함수는 주소 값 자체를 리턴하면 안 된다. 다른 것이 stack을 사용하게 되면 값을 덮어 쓴다.

함수가 끝난다고 사라지는 것은 아니다. return이 되면 가리키는 곳이 달라질 뿐 값이 없어지는 것은 아니다. 하지만 값이 보호 받지 못한다.

함수의 인자는 {}에서만 보호 받을 수 있다. 지역변수가 보호 받기위해서는 EBP와 ESP 사이에 있어야만 보호 받을 수 있다

RW, ZI, RO 3가지가 있다.


RW : read-write로서, 초기 값이 있는 전역변수를 의미한다.

ZI : Zero-initialized로서, 초기 값이 0인 전역변수를 의미한다.

RO : Read-only로서 수정이 불가능한 const 전역 변수와 text, code를 의미한다.

      const로 전역변수를 선언하면 RO에 포함된다.


Flash MCP

Flash : ROM, 전원이 꺼져도 그 내용을 계속 유지하는 메모리이다.

RO : code하고, const data니까 우리는 항상 그 값을 유지하고 있어야 한다.

       ROM, 즉 Flash에 그 내용이 들어 있어야 한다.

RW : 언제라도 modify 가능해야 하면서도, 초기 값을 가지고 있어야 한다.

       ROM에 있어야 하며, manipulation이 가능한 RAM에도 위치해야 한다.

ZI : 값이 모두 0이므로 ROM에 저장할 필요 없이, RAM에 위치하면 된다



ELF format Object File에 관한 진실

ELF

Executable and Linking Format을 의미한다. 실행 가능한 그리고 링크를 하는 형식을 말한다.

relocatable file :  최종 실행 가능한 file이 아니라, link 가능한 object file이다.

                   나중에 link를 통해서 재배치가 가능하다.

                     Assembler에 통과하여, link 가능하게 table 형태로 만들어 놓은 것이다.

ELF format Object file : Assembler의 output이다. armcc와 cl의 object파일 내용.



Object Format

Linking View : Link하기 전의 object file(.o)이다.

Execution View : Link가 끝난 후에 완전한 실행 가능한 형태가 된 ELF 형식이다.



ELF Header

#define EI_NIDENT 16
typedef struct {
        unsigned char e_ident[EI_NIDENT];
        Elf32_Half e_type;
        Elf32_Half e_machine;
        Elf32_Word e_version;
        Elf32_Addr e_entry;
        Elf32_Off e_phoff;
        Elf32_Off e_shoff;
        Elf32_Word e_flags;
        Elf32_Half e_ehsize;
        Elf32_Half e_phentsize;
        Elf32_Half e_phnum;
        Elf32_Half e_shentsize;
        Elf32_Half e_shnum;
        Elf32_Half e_shstrndx;

} Elf32_Ehdr; 

구조체



readelf

ELF file의 내용물을 볼 수 있다.

readelf -h Xtest.o

-h는 header option이다.







728x90