PIC 인 zImag에서 symbol relocation 관련해서 제가 이해하고 있는 것이 맞는지 확인하고 싶어서 이렇게 글을 다시 올립니다.
< 제 생각 >
아래 부분에서 __bss_start 와 _end 는 bss 영역으로 link 시 0x00000000 base로 fixup 이 됩니다.
이 주소가 그대로 사용된다면 RAM 물리주소가 0x0 이 아닌 0x50000000 같은 주소에서 시작하는 시스템에서는
초기 head.S 코드가 실행될 때는 주소 오류가 발생하겠죠.
그래서 분명 load-time relocation 이 되어야 할 듯한데 zImage 자체가 PIC(position independent) 로 생성되기 때문에
GOT(global offset table) 을 이용하여 relocation 이 될 거 같습니다.
그렇다면 아래 __bss_start와 _end 가 GOT entry로 등록되어 있고 load 시 그 pointer 값이 relocation 되는 게 맞나요?
분명 not_relocated 레이블로 빠지지 않는 경우 GOT update를 하는거 같은데 그게 이건지...
LC0: .word __bss_start
.word _end
.word zreladdr
.word _start
.word user_stack+4096
.size LC0, . - LC0
.
안녕하세요.
원하는 답변이 맞는지 몰라 걱정이 되네요.
ARM 기준으로 설명하자면,
링크 타임에 arch/arm/boot/compressed/vmlinux.lds에 보면 ENTRY(_start)를 시작으로 __bss_start 와 _end의 주소가 정해지게 됩니다.
그리고 나서 실행시
링크시에 정해진 LC0와 실제 메모리에 로드된 LC0의 주소의 차이를 offset으로 해서 relocation이 이루어집니다.
제가 보고있는 3.16.13 버전을 보면,
arch/arm/boot/compressed/head.S의 restart label에서 delta를 구해서 처리하는 것 같습니다.