Notice
Recent Posts
Recent Comments
LuvSea
elf32-littlearm.lds 파일 분석 본문
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
링커 스크립트인 elf32-littlearm.lds 파일에 대한 분석이다.
링커 스크립트는 링커에게 코드배치를 이렇게 하라고 설명하는 파일이며, 더 자세한 내용은 다음의 포스트를 참조하자.
링커 스크립트는 링커에게 코드배치를 이렇게 하라고 설명하는 파일이며, 더 자세한 내용은 다음의 포스트를 참조하자.
/* elf32-littlearm.lds 파일 */
//이 부분은 arm-linux-ld가 만들어 낼 최종 결과 파일의 포맷을 나타낸다.
//즉, little endian 포맷의 파일을 생성할 것인지,
//big endian 포맷의 파일을 생성할 것인지를 결정하는 역할을 한다.
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
//이 부분은 최종 결과 파일이 동작할 CPU의 architecture를 나타낸다.
//즉, 이 파일은 ARM CPU 상에서 동작한다는 의미이다.
OUTPUT_ARCH(arm)
//최종 결과 파일의 시작 지점을 나타낸다.
//즉, 여기서 파일의 시작 지점은 reset_handler가 된다.
//reset_handler는 Cstartup.s 파일에 정의되어 있다.
ENTRY(reset_handler)
//SECTIONS{ ... }부분은 링커(arm-linux-ld)가 입력 파일들의 섹션들을
//결과 파일의 어떤 섹션들로 위치시킬지를 결정하는 역할을 한다.
SECTIONS
{
.text : { //프로그램의 코드영역
_stext = .; //코드영역의 시작주소를 makefile로 부터 가져온다.
//이 부분은 arm-linux-ld가 만들어 낼 최종 결과 파일의 포맷을 나타낸다.
//즉, little endian 포맷의 파일을 생성할 것인지,
//big endian 포맷의 파일을 생성할 것인지를 결정하는 역할을 한다.
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
//이 부분은 최종 결과 파일이 동작할 CPU의 architecture를 나타낸다.
//즉, 이 파일은 ARM CPU 상에서 동작한다는 의미이다.
OUTPUT_ARCH(arm)
//최종 결과 파일의 시작 지점을 나타낸다.
//즉, 여기서 파일의 시작 지점은 reset_handler가 된다.
//reset_handler는 Cstartup.s 파일에 정의되어 있다.
ENTRY(reset_handler)
//SECTIONS{ ... }부분은 링커(arm-linux-ld)가 입력 파일들의 섹션들을
//결과 파일의 어떤 섹션들로 위치시킬지를 결정하는 역할을 한다.
SECTIONS
{
.text : { //프로그램의 코드영역
_stext = .; //코드영역의 시작주소를 makefile로 부터 가져온다.
*(.text) //모든 입력 파일들(*)의 .text 섹션을 결과 파일의 .text 섹션에 위치시킨다.
*(.rodata) //readonly 파일들을 .text 섹션에 위치시킨다.
*(.rodata*) //그외 모든 데이터들을 .text 섹션에 위치시킨다.
. = ALIGN(4); //현재의 위치에서 4 바이트 단위로 놓겠다는 의미이다.
// 즉, 4바이트 단위로 메모리를 정렬한다.
_etext = . ; //코드영역의 끝을 현재 위치포인트로 하겠다는 의미이다.
}
//데이터 영역
//코드영역 시작주소부터 코드영역의 크기만큼 더한다음 주소 즉, 코드영역 다음 주소
.data : AT ( ADDR (.text) + SIZEOF (.text) ) {
_sdata = .;
*(.vectors) //모든 입력 파일의 벡터 테이블을 데이터 영역에 포함
*(.data) //모든 입력 파일의 초기화 된 데이터를 데이터 영역에 포함
_edata = .;
}
//bss 영역
//noload = 적재하지 않는다.
.bss (NOLOAD) : {
. = ALIGN(4);
_sbss = .;
*(.bss) //모든 입력 파일의 bss영역을 출력파일의 bss영역에 포함한다.
_ebss = .;
}
}
end = .;
*(.rodata) //readonly 파일들을 .text 섹션에 위치시킨다.
*(.rodata*) //그외 모든 데이터들을 .text 섹션에 위치시킨다.
. = ALIGN(4); //현재의 위치에서 4 바이트 단위로 놓겠다는 의미이다.
// 즉, 4바이트 단위로 메모리를 정렬한다.
_etext = . ; //코드영역의 끝을 현재 위치포인트로 하겠다는 의미이다.
}
//데이터 영역
//코드영역 시작주소부터 코드영역의 크기만큼 더한다음 주소 즉, 코드영역 다음 주소
.data : AT ( ADDR (.text) + SIZEOF (.text) ) {
_sdata = .;
*(.vectors) //모든 입력 파일의 벡터 테이블을 데이터 영역에 포함
*(.data) //모든 입력 파일의 초기화 된 데이터를 데이터 영역에 포함
_edata = .;
}
//bss 영역
//noload = 적재하지 않는다.
.bss (NOLOAD) : {
. = ALIGN(4);
_sbss = .;
*(.bss) //모든 입력 파일의 bss영역을 출력파일의 bss영역에 포함한다.
_ebss = .;
}
}
end = .;
'sTudy' 카테고리의 다른 글
에셈블리로하는 나눗셈 (0) | 2009.08.10 |
---|---|
data 세그먼트와 bss 세그먼트 (0) | 2009.08.10 |
Boot Code(Startup Code) (0) | 2009.08.10 |
RS232 시리얼 통신 관련 레지스터 정리 (0) | 2009.08.10 |
ATmega128은 Little endian일까 Big endian일까?? (0) | 2009.08.10 |
Comments