1차 스터디에서 책읽으면서 같이 공부하다가 나온 내용을 정리해 보았습니다.
.note/.comment의 내용/ vmlinuz를 만드는 내용은 elf 파일 형식과 관련이 있더군요.
ELF 파일 포맷
ELF(Executable and Linkable Format) 은 실행 파일, object 코드, 공유 라이브러리, 그리고 코어 덤프의 파일 형식대한 공통 표준이다. System V Application Binary Interface 스펙에서 처음 발표되었고, 그후 Tool Interface Standard에서 발표되고, Unix system의 서로 다른 벤더에서 빠르게 사용되었다. 1999년에 86open project에 의해서 x86 기반의 Unix와 Unix-like system을 위한 표준 바이너리 파일로 선택되었다.
ELF 는 유연하고 확장성이 있는 설계를 갖고 있어 특정 Processor나 Architecture에 종속되지 않는다. 이것은 많은 서로 다른 플랫폼에 의해서 적용되었다.
파일 구조
ELF는 디스크에 저장된 프로그램 또는 프로그램의 조각을 저장하기 위한 형식으로 컴파일과 링킹의 결과로 생성된다. ELF 파일은 2 섹션으로 나누어진다. 실행파일의 경우, 코드를 위한 text 섹션, 전역 변수를 위한 data 섹션, 그리고 보통 문자열 상수가 포함된 rodata 섹션이 있다. ELF 파일은 memory 상에서 저장되어야만 하는 섹션을 어떻게 기술하는지를 나타내는 header를 포함한다.
.text | 실제 코드를 저장하는 섹션. objdump -drS .process.o로 볼 수 있다. |
.data | 전역 테이블, 변수, 등을 저장하는 섹션. objdump -s -j .data .process.o는 이것을 hex 형식으로 덤프한다. |
.bss | 파일에서 .bss의 bit을 찾지 말자. 왜냐하면 거기엔 아무것도 없기 때문이다. 초기화 되지 않은 배열과 변수가 거기에 있고, loader는 이들이 0으로 채워져야만 한다고 “알고 있다”. 이미 있는 곳 보다 더 많은 0을 디스크에 저장할 필요가 없기 때문이다. |
.rodata | 프로그램의 문자열이 저장되는 섹션, 보통 링킹 과정에서 잊어버리면, 커널이 동작하지 않게 된다. objdump -s -j .rodata.process.o 는 hex 형식으로 덤프한다. 컴파일러에 따라, 이와 같은 섹션이 더 많을 수도 있다. |
.comment & .note | 컴파일러/링커 툴체인에 의해서 입력되는 단순 커멘트 |
.stab & .stabstr | 디버깅 심볼과 이와 유사한 정보 |
자세한 내용은 아래 블로그에 올려놨으니 참고하시면 좋을 것 같습니다.
http://colso11.iptime.org/~asradad1/?p=169
댓글 6
.
좋은 정리 감사합니다 ~_~