File : (TOPDIR)/board/samsung/mango210/u-boot.lds

LD(loader & Linker)의 input으로 주어져서, object 파일을 생성하는데 규칙을 제공한다.

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;

    . = ALIGN(4);
    .text      :
    {
      cpu/s5pc11x/start.o   (.text)
      cpu/s5pc11x/s5pc110/cpu_init.o    (.text)
      board/samsung/mango210/lowlevel_init.o    (.text)
          cpu/s5pc11x/nand_cp.o (.text)
          cpu/s5pc11x/movi.o (.text)
          common/secure.o (.text)
      common/ace_sha1.o (.text)
      *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(.rodata) }

    . = ALIGN(4);
    .data : { *(.data) }

    . = ALIGN(4);
    .got : { *(.got) }

    __u_boot_cmd_start = .;
    .u_boot_cmd : { *(.u_boot_cmd) }
    __u_boot_cmd_end = .;

    . = ALIGN(4);
    .mmudata : { *(.mmudata) }

    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) }
    _end = .;
}



⊙ OUTPUT_FORMAT은 ELF32의 little endian으로 코드를 생성

⊙ OUTPUT_ARCH는 binary를 실행 할 수 있는 CPU architecture를 ARM으로 사용

⊙ ENTRY point은 프로그램의 시작을 가리키며, 시작되는 함수의 이름은 "_start"이다.

⊙ SECTIONS를 보면 text, rodata, data, got, mmudata, bss라는 section들이 정의되어 있다.
        .text  :  실행할 프로그램 코드 영역
        .rodata  :  read-only data 영역 (const 등으로 지정된 데이터)
        .data  :  initialized data 영역
        .got  :  global offset table 영역
        .mmudata  :  MMU data 영역
        .bss  :  uninitialized data 영역

⊙ 특수한 링커 변수 dot `.' 는 항상 현재 출력 address point을 담고 있다.
         address point 는 출력 섹션의 크기만큼 증가한다.

⊙ `*'는 어떤 파일명에도 대응한다. `*(.text)'는 모든 입력파일의 모든 입력 섹션 `.text'을 의미한다.

⊙ 프로그램 코드는 0x00000000에서 시작해서 4byte단위로 정렬된 text section에 놓여질 것이다.

⊙ U-boot의 시작은 Entry point에 선언된 _start부터 시작된다.

⊙ _start는 (TOPDIR)/cpu/s5pc11x/start.S에 정의되어 있다.

⊙ TEXT_BASE에의해 Linker수행 시 symbol들은 상대적 주소를 갖는다.

⊙ Power가 on 한 후 0x00번지(즉,flash)에서 시작하여 memory초기화를 거쳐 flash의 내용을 dram에 relocate
    하면 비로써 dram 에서 동작 하게 된다.

⊙ Symbol들은 모두 TEXT_BASE의 상대적 주소 값을 가지고 있으므로, dram에 relocate전에는 offset branch
    명령만 사용 해야 한다.(B,BL,ADR)

Posted by eoseontaek